MongoDB过滤多个子文档

Posted

技术标签:

【中文标题】MongoDB过滤多个子文档【英文标题】:MongoDB filter multi sub-documents 【发布时间】:2015-07-23 18:06:39 【问题描述】:

我在 mongo DB 中有一个类似这样结构的文档,我想过滤以仅显示活动的子文档:活动的汽车和活动的水果。

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

这是我想要的结果。

    
       "name":"Andre",
       "fruits":[
           
              "active":true,
              "fruitname":"apple" 
           
       ],
       "cars":[
          
               "active":true,
               "carname":"GM"
           ,
       ]
    

我试过Aggregate,但是当任何汽车或任何水果活动时,它什么也没有返回。

    m_object.aggregate([
         $match : 
           "name": "andre"
       ,
        $unwind : "$fruits" ,
        $unwind : "$cars" ,
        $match : 
        'fruits.active':$eq: true
        ,
        $match : 
        'cars.active':$eq: true
        ,

     $group : 
       "name": "$name",
       cars:  $addToSet : "$cars" 
       fruits:  $addToSet : "$fruits" 
    
    ], function (err, result) 
        if (err) 
            console.log(err);
            return;
        
        console.log('result');
    );

有没有办法在那些子文档中省略"active":false 子文档?

【问题讨论】:

【参考方案1】:

使用以下聚合管道获得所需的结果:

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');
        );

或者您可以使用 aggregation pipeline 构建器,如下所示:

m_object.aggregate()
        .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
        )
        .exec(callback);

【讨论】:

它有效,但是如果所有汽车都是active: false,则根本没有返回任何[ ]。有什么方法可以使用此解决方案,如果所有汽车都被禁用,请获取 ["name":andre", fruits[..,..], "cars":[]] 而不是 [] @AndreTorbitoni 以你的方式改变你的问题真的不是一个好主意。对于那些过来发现提供的答案与您所要求的不符的人来说,这是非常具有误导性的。如果您发布另一个问题,我将与其他人一样乐意回答。这里的一般情况是一问一答。我可以回答您的其他问题,但这应该完全是另一个问题。请单独发布。 对不起,我已经为此写了另一个问题。 ***.com/questions/30199798/…

以上是关于MongoDB过滤多个子文档的主要内容,如果未能解决你的问题,请参考以下文章

在 Mongoose/MongoDB 的文档中过滤数组、子文档、数组、文档

如何使用MongoDB过滤子文档中的数组[重复]

MongoDb - $match 过滤器在子文档中不起作用

MongoDB使用基于子文档的Mongoose过滤器

基于多个子文档的MongoDB/Mongoose查询

如何匹配 MongoDB 中的子文档数组?