mongoDB聚合返回空

时间:2015-05-12 19:27:00

标签: node.js mongodb mongoose

扩展了以下问题:MongoDB filter multi sub-documents我希望过滤文档以仅显示活动子文档:活动汽车和活动水果。

在以下文档中使用chridam的汇总管道构建,其中禁用所有fruits

{
   "name":"Andre",
   "fruits":[
       {
          "active":false,
          "fruitname":"apple" 
       },{
          "active":false,
          "fruitname":"banana" 
       }
   ],
   "cars":[
       {
           "active":false,
           "carname":"ford"
       },{
           "active":true,
           "carname":"GM"
       },
   ]
}

使用的聚合管道:

var pipeline = [
{
    "$match": {
        "name": "Andre",
        "fruits.active": true,
        "cars.active": true
    }
},
{ "$unwind": "$fruits" },
{ "$unwind": "$cars" },
{
    "$match": {            
        "fruits.active": true,
        "cars.active": true
    }
},
{ 
    "$group": {
        "_id": {
            "_id": "$_id",
            "name": "$name"
        },
        "cars": { "$addToSet" : "$cars" },
        "fruits": { "$addToSet" : "$fruits" }
    }
},
{
    "$project": {
        "_id": 0,
        "name": "$_id.name",
        "cars": 1,
        "fruits": 1
    }
}    
]

m_object.aggregate(pipeline)
        .exec(function (err, result) {
            if (err) {
                console.log(err);
                return;
            }
            console.log('result');
        });

而不是

[{
   "name":"Andre",
   "fruits":[],
   "cars":[
      {
           "active":true,
           "carname":"GM"
       },
   ]
}]

聚合返回

[]

2 个答案:

答案 0 :(得分:1)

尝试以下聚合管道,它不会为非活动元素返回一个空数组,但更接近结果:

db.collection.aggregate([
    {
        "$match": {
            "name": "Andre",
            "$or": [
                { "fruits.active": true },
                { "cars.active": true }
            ]
        }
    },
    { "$unwind": "$fruits" },
    { "$unwind": "$cars" },
    {
        "$match": {            
            "$or": [
                { "fruits.active": true },
                { "cars.active": true }
            ]
        }
    },
    {
        "$project": {
            "name": 1,
            "active_cars": "$cars.active",
            "active_fruits": "$fruits.active",
            "cars": 1,
            "fruits": 1
        }
    },
    {
        "$project": {
            "name": 1,
            "cars": {
                "$cond": [
                    { "$eq": ["$active_cars", true] },
                    "$cars",
                    {}
                ]
            },
            "fruits": {
                "$cond": [
                    { "$eq": ["$active_fruits", true] },
                    "$fruits",
                    {}
                ]
            }
        }
    },   
    { 
        "$group": {
            "_id": {
                "_id": "$_id",
                "name": "$name"
            },
            "cars": { "$addToSet" : "$cars" },
            "fruits": { "$addToSet" : "$fruits" }
        }
    },
    {
        "$project": {
            "_id": 0,
            "name": "$_id.name",
            "cars": 1,
            "fruits": 1
        }
    }    
])

<强>输出

/* 1 */
{
    "result" : [ 
        {
            "cars" : [ 
                {
                    "active" : true,
                    "carname" : "GM"
                }
            ],
            "fruits" : [{}],
            "name" : "Andre"
        }
    ],
    "ok" : 1
}

答案 1 :(得分:0)

让我们看一下管道中的第一个操作,即查询条件:

"$match": {
   "name": "Andre",
   "fruits.active": true,
   "cars.active": true
}

英文:&#34;找到name = Andre所有文件,其中至少有一个活跃的水果至少有一辆活跃的汽车。&#34;

因此,您明确地请求在没有活动水果和汽车的情况下获得任何结果,因此结果为空。