2013-04-02 10 views
14

mam tej kwerendy:Jak ukryć _id od Aggregation?

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

wynik dał mi tak:

print produits 

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

więc mogę zrobić:

prod = produits["result"] 

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

ale jak mogę ukryć "_id" więc mogę tylko uzyskaj

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

w normalnych zapytaniach dodam tylko coś takiego, jak {"_id":0} tutaj nie działa.

Odpowiedz

24

Od MongoDB docs

Można $ PROJECT wyniki wykluczyć _id - czy to co masz na myśli?

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

Uwaga Pole _id jest zawsze włączone domyślnie. można jednoznacznie wykluczyć _id następująco:

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

Od jesteś przykładem, pierwsza operacja w rurociągu byłoby wykluczyć _id i obejmować inne attribs.

+0

, więc muszę dodać operatora $ project? –

+0

dodanie go na końcu daje błąd, jak to się nazywa "[{" $ unwind ":" $ pup "}, {" $ match ": {" pup.spec.np ": nomp}}, {" $ group ": {" _ id ":" $ pup.spec.id "," pup ": {" $ push ":" $ pup "}}}, {" $ project ": {" _ id ": 0}} ] ' –

+2

Patrząc na twoje polecenie, wygląda na to, że grupa jest pusta. Nie jestem zaznajomiony ze składnią, ale jeśli chcesz tylko wyeliminować _id z wyjścia, umieść '{$ project: {_id: 0, pup: 1}}' jako ostatnią operację na rurociągu – sambomartin

2

Nie jestem zaznajomiony z silnikiem, ale powinieneś być w stanie usunąć właściwość bezpośrednio z wyników testu.

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

dziękuję , tak, mogę to zrobić za pomocą Pythona za pomocą indeksów, ale to się komplikuje, gdy jest więcej niż jeden wynik, więc muszę iterować dwa razy, dla wyników (słownik), a dla list indeksów BTW: silnik działa tak samo jak pymongo, z wyjątkiem tego, że używa wywołań zwrotnych, ponieważ wykonuje połączenia bez blokowania –

-1

To nie jest exaclty mongoWay to zrobić, ale można skorzystać z tej fabryki, aby wygenerować obiekt, który zawiera wszystko, ale _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 } 
} 

następnie używać go tak:

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

Dochody są najlepsze z komentarzem wyjaśniającym przyczynę. W ten sposób każdy z nas może się o tym dowiedzieć. – Danielo515