MongoDB在满足条件的情况下获取所有嵌入式文档

时间:2019-11-28 03:35:33

标签: mongodb nosql

我在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

有人可以指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

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

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

#Data = DataFrame, columns: fitted.values - ndvi/y-axis values, ts : time/x-axis values
#Caluclate index for maxima and peaks    

x = np.array(Data['fitted.values'])
extrema_index = argrelextrema(data = x,comparator = np.greater )  
peak_index = find_peaks(Data['fitted.values'])[0]

这将使您返回:

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

答案 1 :(得分:1)

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

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" }