Как скрыть _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}
но здесь это не работает.
Ответы
Ответ 1
Из документов mongodb
Вы можете $прогнозировать результаты, чтобы исключить _id
- это то, что вы имеете в виду?
http://docs.mongodb.org/manual/reference/aggregation/#pipeline
Примечание. Поле _id всегда включается по умолчанию. Вы можете явно исключить _id следующим образом:
db.article.aggregate(
{ $project : {
_id : 0 ,
title : 1 ,
author : 1
}}
);
Из примера, первая операция в конвейере должна была исключить _id и включить другие атрибуты.
Ответ 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'}}]}]
Ответ 3
Начиная с 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" } } ] }
Ответ 4
Это не означает, что это сделать, но вы можете использовать этот factory для создания объекта, который включает все, кроме _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')
)