web-dev-qa-db-fra.com

Comment masquer _id de l'agrégation?

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.

22
Abdelouahab Pp

À 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.

46
sambomartin

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'}}]}]
2
Michael Pratt

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" } } ] }
1
Xavier Guihot