MongoDB $project用于提取特定属性(将其作为数组返回)

5

我有一个像这样的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个回答

8
您可以使用以下类似于$project的方法将client.name字段提升到顶层:
{$project: {_id: 0, name: "$client.name"}}

MongoDB 3.4更新

现在你可以更直接地使用$replaceRoot阶段取代$project来实现这个功能:

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

它们有很多属性,不仅仅是名称,正如“…”所示。 - Ivan Koshelev
@IvanKoshelew 三年后,您现在可以使用$replaceRoot来处理它,通过将整个嵌入式client对象提升到根目录,如更新的答案所示。 - JohnnyHK

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

我正在使用C#驱动程序,它只能使用MapReduce或Agregation,而且它的MapReduce必须同时具有Map和Reduce函数。到目前为止还没有成功。 - Ivan Koshelev
@Ivan Koshelew,您可以像我上面展示的那样使用聚合操作符**$group。它只返回一个文档,而字段result**包含您想要的内容。 - Wizard

0

Mongo 4.2 开始,$replaceWith 聚合操作符可以用于将一个文档替换为另一个文档(在我们的情况下是子文档),作为 $replaceRoot 操作符的语法糖:

// { 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 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接