【问题标题】:MongoDB get all embedded documents where condition is metMongoDB获取满足条件的所有嵌入文档
【发布时间】:2019-11-28 14:20:24
【问题描述】:

我在我的 mongodb 中做了这个:

db.teams.insert({name:"Alpha team",employees:[{name:"john"},{name:"david"}]});
db.teams.insert({name:"True team",employees:[{name:"oliver"},{name:"sam"}]});
db.teams.insert({name:"Blue team",employees:[{name:"jane"},{name:"raji"}]});
db.teams.find({"employees.name":/.*o.*/});

但我得到的是:

{ "_id" : ObjectId("5ddf3ca83c182cc5354a15dd"), "name" : "Alpha team", "employees" : [ { "name" : "john" }, { "name" : "david" } ] }
{ "_id" : ObjectId("5ddf3ca93c182cc5354a15de"), "name" : "True team", "employees" : [ { "name" : "oliver" }, { "name" : "sam" } ] }

但我真正想要的是

[{"name":"john"},{"name":"oliver"}]

如果不使用某种编程迭代器/循环,我很难找到这样的示例。或者我找到的示例返回父文档,这意味着我必须解析出嵌入式数组员工并执行某种 UNION 语句?

例如。

How to get embedded document in mongodb? Retrieve only the queried element in an object array in MongoDB collection

有人能指出正确的方向吗?

【问题讨论】:

  • 您只需要“名称”字段的数组吗?还是完整的记录?
  • 我想要相当于SELECT name FROM employees WHERE name LIKE '%o%' ORDER BY name ASC

标签: mongodb nosql


【解决方案1】:

请添加投影以过滤掉不需要的字段。请参考项目链接mongodb projections

您的查找查询应使用如下投影参数构造:

db.teams.find({"employees.name":/.*o.*/}, {_id:0, "employees.name": 1});

这将返回您:

[{"name":"john"},{"name":"oliver"}]

【讨论】:

  • 你能告诉我这个问题的语法有什么问题吗? stackoverflow.com/questions/59081852/…
  • 查询返回:{ "employees" : [ { "name" : "john" }, { "name" : "david" } ] } { "employees" : [ { "name" : "oliver" }, { "name" : "sam" } ] }.
【解决方案2】:

可以通过简单的聚合管道来解决。

db.teams.aggregate([
    {$unwind : "$employees"},
    {$match : {"employees.name":/.*o.*/}},
])

编辑:

OP 想要跳过父字段。修改后的查询:

db.teams.aggregate([
    {$unwind : "$employees"},
    {$match : {"employees.name":/.*o.*/}},
    {$project : {"name":"$employees.name",_id:0}}
])

输出:

{ "name" : "john" }
{ "name" : "oliver" }

【讨论】:

  • 您的解决方案返回父文档及其字段。我该如何排除?或者如果我说SELECT name FROM employees WHERE name LIKE '%o%' ORDER BY name DESC
  • @John 您可以添加另一个 $project 以将结果别名为:{$project:{"name":"$employees.name",_id:0}},然后添加另一个 $sort 进程为 {$sort:{"name":-1}}在 mongo 中 @987654329 @ 表示降序,1 表示升序。)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 2018-04-02
  • 2016-04-23
  • 2021-06-09
  • 2017-04-24
  • 1970-01-01
  • 2021-05-02
相关资源
最近更新 更多