33

我有这个查询:

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}但在这里它不起作用。

4

4 回答 4

68

来自 mongodb 文档

您可以 $project 将结果排除在外_id- 这是您的意思吗?

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

注意 默认情况下始终包含 _id 字段。您可以明确排除 _id,如下所示:

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

从您的示例来看,管道中的第一个操作是排除 _id 并包含其他属性。

于 2013-04-02T23:57:22.487 回答
8

开始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" } } ] }
于 2019-06-09T16:32:42.033 回答
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'}}]}]
于 2013-04-02T23:54:46.287 回答
-1

这不是一种 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') 
)
于 2016-05-11T16:58:52.033 回答