2013-04-02 31 views
14

我有此查詢:如何從聚合隱藏_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}它不工作。

回答

24

從MongoDB的文檔

可以美元的項目,結果排除_id - 這是什麼意思?

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

注_id字段默認總是包括在內。你可以明確排除_id如下:

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

從你例如,在管道中的第一個操作將排除_id,幷包括其他attribs。

+0

所以我必須添加$ project運算符? –

+0

在年底將其添加giveme錯誤,如何做到這一點把它'[{ 「$開卷」: 「$小狗」},{ 「$匹配」:{ 「pup.spec.np」:nomp}},{」 $ group「:{」_ id「:」$ pup.spec.id「,」pup「:{」$ push「:」$ pup「}}},{」$ project「:{」_ id「:0}} ]' –

+2

看着你的命令,它看起來像你正在分組是null。我不熟悉的語法,但如果你只是想消除輸出_id,把'{$項目:{_id:0,小狗:1}}'在管道上 – sambomartin

2

我不熟悉的運動,但你應該能夠從字典直接結果刪除屬性。

>>> 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'}}]}] 
+0

謝謝,是的,我可以通過使用索引蟒蛇它做什麼,但它變得複雜,當有一個以上的結果,所以我必須重複兩次,結果(字典),並列出指標 BTW:電機的工作方式一樣pymongo,除了它使用回調,因爲它使非阻塞呼叫 –

-1

這不是exaclty做這件事的mongoWay,但您可以使用此工廠生成的對象包括所有,但_id

/** 
* Factory that returns a $project object that excludes the _id property https://docs.mongodb.com/v3.0/reference/operator/aggregation/project/ 
* @params {String} variable list of properties to be included 
* @return {Object} $project object including all the properties but _id 
*/ 
function includeFactory(/* properties */){ 
    var included = { "_id": 0 }; 
    Array.prototype.slice.call(arguments).forEach(function(include){ 
     included[include] = true 
    }) 

    return { "$project": included } 
} 

然後使用它是這樣的:

cities.aggregate(
{ "$group": { "_id": null, "max": { "$max": "$age" }, "min": { "$min": "$age" }, "average": { "$avg": "$age" }, "total": { "$sum": "$count" } } }, 
     includeFactory('max','min','average','total') 
) 
+2

Downvotes最好有解釋原因的評論。這樣我們所有人都可以瞭解它。 – Danielo515