J'ai cette requête:
produits = yield motor.Op(db.users.aggregate, [{"$unwind":"$pup"},{"$match":{"pup.spec.np":nomp}}, {"$group":{"_id":"$pup.spec.id","pup":{"$Push":"$pup"}}}])
ce qui me donne ce résultat:
print produits
{u'ok': 1.0, u'result': [{u'_id': None, u'pup': [{u'avt': {u'fto': ..all the results}}]}]}
donc je peux faire:
prod = produits["result"]
[{u'_id': None, u'pup': [{u'avt': {u'fto': ..all the results}}]}]
mais comment puis-je cacher "_id"
pour que je ne puisse obtenir que:
[{u'pup': [{u'avt': {u'fto': ..all the results}}]}]
dans une requête normale, j'ajouterais simplement quelque chose comme {"_id":0}
mais ici ça ne marche pas.
À partir des documents mongodb
Vous pouvez $ projeter les résultats pour exclure le _id
- c'est ce que tu veux dire?
http://docs.mongodb.org/manual/reference/aggregation/#pipeline
Remarque Le champ _id est toujours inclus par défaut. Vous pouvez explicitement exclure _id comme suit:
db.article.aggregate(
{ $project : {
_id : 0 ,
title : 1 ,
author : 1
}}
);
Dans votre exemple, la première opération dans le pipeline serait d'exclure le _id et d'inclure les autres attributs.
Je ne suis pas familier avec le moteur, mais vous devriez pouvoir supprimer directement la propriété des résultats.
>>> produits = {u'ok': 1.0, u'result': [{u'_id': None, u'pup': [{u'avt': {u'fto': 'whatever'}}]}]}
>>> prod = produits['result']
>>> del prod[0]['_id']
>>> print prod
[{u'pup': [{u'avt': {u'fto': 'whatever'}}]}]
Démarrage Mongo 4.2
, les $unset
L'opérateur d'agrégation peut être utilisé comme une syntaxe alternative pour $project
lorsqu'il est utilisé pour supprimer uniquement les champs:
// { _id: "1sd", pup: [{ avt: { fto: "whatever"} }] }
// { _id: "d3r", pup: [{ avt: { fto: "whatever else"} }] }
db.collection.aggregate({ $unset: ["_id"] })
// { pup: [{ avt: { fto: "whatever" } } ] }
// { pup: [{ avt: { fto: "whatever else" } } ] }