如何从Mongo中的数组中获取对象

时间:2017-07-10 05:22:39

标签: mongodb

我正在使用mongo v3.4.4
如何获取数组的对象 收集样本

{
    name: earth
    age: 12
    cars : [
        {
            brand : tesla
            color : red
            time : 123
        },
        {
            brand : toyota
            color : black
            time : 124
        },
    ]

},
{
    name: mars
    age: 15
    cars : [
        {
            brand : volvo
            color : green
            time : 125
        },
        {
            brand : honda
            color : blue
            time : 126
        },
    ]
}

我只需要:

{
    brand : tesla
    color : red
    time : 123
}

我试过了:

db.users.aggregate([
    {
        $match:{"name":"earth"}
    },
    {
        $project:
            {"cars":
                {"$filter":
                    {
                      input:"$cars", 
                      as:"cars", 
                      condition: "{$eq:[ $$cars.brand :"tesla"]}"
                      }
                 }
            }
      }
 ])

但是,我仍然没有看到我预期的输出。我不确定我是否正确使用过滤器。如果cars数组中只有一个对象,那么我只返回那个对象。 我看过这个example

3 个答案:

答案 0 :(得分:1)

您可以使用以下聚合管道:

db.users.aggregate([
 {$match: {name:"earth"}},
 {$unwind: "$cars"},
 {$replaceRoot: {newRoot: "$cars"}},
 {$match: {brand:"tesla"}}
]);

答案 1 :(得分:1)

使用以下聚合查询:

 db.users.aggregate({$match:{name:'earth'}},{$unwind:"$cars"},{$match:{"cars.name":'tesla'}},{$project:{"cars":"$cars",_id: 0}});

结果就像这样

{ "cars" : { "name" : "tesla", "color" : "red" } }

答案 2 :(得分:1)

我会说通过使用以下查询

而不是使用聚合
db.users.find({ "name":"earth" }, { "cars" : { "$elemMatch" : { "name" : "tesla }}})

你的输出将是,

{
   "cars" : [ 
    {
       brand : tesla
       color : red
       time : 123
    }]
}

聚合始终是一项代价高昂的操作