【问题标题】:mongoDB Aggregation retuns emptymongoDB 聚合返回空
【发布时间】:2015-07-23 20:29:38
【问题描述】:

扩展以下问题: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"
       },
   ]
}]

聚合返回

[]

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案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
    }
    

    【讨论】:

      【解决方案2】:

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

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

      英文:“找到所有带有name = Andre 的文件,其中至少有一种活跃的水果至少有一辆活跃的汽车。”

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

      【讨论】:

        猜你喜欢
        • 2016-08-10
        • 1970-01-01
        • 1970-01-01
        • 2020-10-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 2018-04-13
        相关资源
        最近更新 更多