mongodb - ¿Cómo ocultar_id de la agregación?
pymongo motordriver (3)
Tengo esta consulta:
produits = yield motor.Op(db.users.aggregate, [{"$unwind":"$pup"},{"$match":{"pup.spec.np":nomp}}, {"$group":{"_id":"$pup.spec.id","pup":{"$push":"$pup"}}}])
el resultado me da esto:
print produits
{u''ok'': 1.0, u''result'': [{u''_id'': None, u''pup'': [{u''avt'': {u''fto'': ..all the results}}]}]}
para que pueda hacer
prod = produits["result"]
[{u''_id'': None, u''pup'': [{u''avt'': {u''fto'': ..all the results}}]}]
pero ¿cómo escondo "_id"
para que solo pueda obtener
[{u''pup'': [{u''avt'': {u''fto'': ..all the results}}]}]
en las consultas normales, solo agrego algo como {"_id":0}
aquí no funciona.
Desde mongodb docs
Puede $ proyectar los resultados para excluir el _id
: ¿esto es lo que quiere decir?
http://docs.mongodb.org/manual/reference/aggregation/#pipeline
Nota El campo _id siempre se incluye de forma predeterminada. Puede excluir explícitamente _id de la siguiente manera:
db.article.aggregate(
{ $project : {
_id : 0 ,
title : 1 ,
author : 1
}}
);
De su ejemplo, la primera operación en la tubería sería excluir el _id e incluir los otros atributos.
Esto no es exactamente una manera de hacerlo, pero puede usar esta fábrica para generar un objeto que incluya todo excepto _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 }
}
Entonces úsalo así:
cities.aggregate(
{ "$group": { "_id": null, "max": { "$max": "$age" }, "min": { "$min": "$age" }, "average": { "$avg": "$age" }, "total": { "$sum": "$count" } } },
includeFactory(''max'',''min'',''average'',''total'')
)
No estoy familiarizado con el motor, pero debería poder eliminar la propiedad de los resultados dictados directamente.
>>> 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''}}]}]