我试图从MongoDB中的数组中获取元素。我认为聚合过滤器是适用的正确选择。但是我已经尝试了百万次,但仍然找不到问题所在。你能帮我一下吗?
MongoDB示例数据:
{ "_id" : 12, "items" : [ { "columns" : [ { "title" : "hhh", "value" : 10 }, { "title" : "hahaha", "value" : 20 } ] }, { "columns" : [ { "title" : "hiii", "value" : 50 } ] } ] }
我的解决方案:
db.myCollection.aggregate([ { $project: { items: { $filter: { input: "$items", as: "item", cond: { $eq: [ "$$item.columns.title", "hahaha" ]} } } } } ]).pretty()
我的结果:
{ "_id" : 15, "items" : [ { "columns" : [ ] }, { "columns" : [ ] } ] }
预期结果:
{ "_id" : 15, "items" : [ { "columns" : [ { "title" : "hahaha", "value" : 20 } ] }, { "columns" : [] } ] }
我检查了Mongo参考资料:https : //docs.mongodb.com/manual/reference/operator/aggregation/filter/#example
MongoDB版本:3.4.1
测试环境:Mongo Shell
您需要对子文档中的子数组使用$map
数组运算符$filter
。另外,您还应该在$addFields
聚合管道阶段执行此操作,以便在需要时将所有其他字段自动包括在查询结果中。
您也可以像平时一样替换$addFields
舞台,$project
但是在这种情况下,您将需要显式包括所有其他字段。
let value = "hahaha"; db.coll.aggregate([ { "$addFields": { "items": { "$map": { "input": "$items", "as": "item", "in": { "columns": { "$filter": { "input": "$$item.columns", "as": "elt", "cond": { "$eq": [ "$$elt.title", value ] } } } } } } } } ])