2013-04-02 4 views
14

Я этот вопрос:Как спрятать _id из Aggregation?

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 Docs

Вы можете $ проецировать результаты исключить _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 operator? –

+0

, добавив его в конец giveme error, как это положить '[{" $ unwind ":" $ pup "}, {" $ match ": {" pup.spec.np ": nomp}}, {" $ group ": {" _ id ":" $ pup.spec.id "," pup ": {" $ push ":" $ pup "}}}, {" $ project ": {" _ id ": 0}} ] ' –

+2

Глядя на вашу команду, похоже, что вы группируете значение null. Я не знаком с синтаксисом, но если вы просто хотите исключить _id из вывода, поместите '{$ project: {_id: 0, pup: 1}}' как последний op на конвейер – sambomartin

2

Я не знаком с двигателем, но вы должны иметь возможность напрямую удалить свойство из результатов dict.

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

спасибо , да, я могу сделать это, используя python, используя индексы, но он становится сложным, когда есть несколько результатов, поэтому я должен повторять итерацию дважды, для результатов (словарь), а для индексов списков 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