MongoDB $项目采取某些属性(将其作为数组返回)

时间:2014-10-18 00:41:41

标签: mongodb project

我有像这样的MongoDB集合

{
    taskType:1,
    client:{name:"Moe",...},
    ...
},
{
    taskType:1,
    client:{name:"Larry",...},
    ...
},
{
    taskType:1,
    client:{name:"Curly",...},
    ...
}

我可以在其上运行以下$ project查询

{$project:{_id:0, client:"$client"}}

我得到了这个结果:

[{
    client:{name:"Moe",...}
},
{
    client:{name:"Larry",...}
},
{
    client:{name:"Curly",...}
}]

但我实际上正在寻找这样的结果:

[
{name:"Moe",...},
{name:"Larry",...},
{name:"Curly",...}
]

我该怎么做(如果可以的话)? 提前谢谢。

3 个答案:

答案 0 :(得分:5)

您可以使用client.name$project字段提升到顶层:

{$project: {_id: 0, name: "$client.name"}}

MongoDB 3.4更新

现在,您可以使用$replaceRoot阶段直接执行此操作,而不是使用$project

{$replaceRoot: {newRoot: '$client'}}

答案 1 :(得分:1)

使用 $ group 作为

db.c.aggregate([{$group: {_id:0, result:{$push:"$client"}}}]);

或者将地图附加到原始答案:

db.c.aggregate([{$project:{_id:0, client:"$client"}}]).map(function(e) {return e.client;});

答案 2 :(得分:0)

Mongo 4.2开始,$replaceWith聚合运算符可以用来代替另一个文档(在我们的情况下为子文档),作为$replaceRoot运算符的语法糖:< / p>

// { taskType: 1, client: { name: "Moe",   age: 34 }, price: 234 }
// { taskType: 2, client: { name: "Larry", age: 48 }, price: 129 }
db.collection.aggregate({ $replaceWith: "$client" })
// { name: "Moe",   age: 34 }
// { name: "Larry", age: 48 }