web-dev-qa-db-ja.com

_idを集約から非表示にする方法は?

私はこのクエリを持っています:

produits = yield motor.Op(db.users.aggregate, [{"$unwind":"$pup"},{"$match":{"pup.spec.np":nomp}}, {"$group":{"_id":"$pup.spec.id","pup":{"$Push":"$pup"}}}])

これは私にこの結果を与えます:

print produits

{u'ok': 1.0, u'result': [{u'_id': None, u'pup': [{u'avt': {u'fto': ..all the results}}]}]}

だから私はできる:

prod = produits["result"]

[{u'_id': None, u'pup': [{u'avt': {u'fto': ..all the results}}]}]

しかし、どうすれば"_id"取得できるように:

[{u'pup': [{u'avt': {u'fto': ..all the results}}]}]

通常のクエリでは、単に{"_id":0}しかし、ここでは機能しません。

22
Abdelouahab Pp

Mongodb docsから

結果を$ projectして_idを除外できます-これはどういう意味ですか?

http://docs.mongodb.org/manual/reference/aggregation/#pipeline

注_idフィールドは常にデフォルトで含まれています。次のように、_idを明示的に除外できます。

db.article.aggregate(
    { $project : {
        _id : 0 ,
        title : 1 ,
        author : 1
    }}
);

たとえば、パイプラインの最初の操作は、_idを除外し、他の属性を含めることです。

46
sambomartin

私はモーターには詳しくありませんが、結果ディクテーションからプロパティを直接削除できるはずです。

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

Mongo 4.2以降、 $unset 集計演算子は、フィールドのドロップのみに使用される場合、$projectの代替構文として使用できます。

// { _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