Spi*_*der 3 mongodb mongodb-query aggregation-framework
我试图从MongoDB中的数组中获取元素。我认为聚合过滤器是适用的正确选择。但是我已经尝试了百万次,但仍然找不到问题所在。你能帮我一下吗?
MongoDB示例数据:
{
"_id" : 12,
"items" : [
{
"columns" : [
{
"title" : "hhh",
"value" : 10
},
{
"title" : "hahaha",
"value" : 20
}
]
},
{
"columns" : [
{
"title" : "hiii",
"value" : 50
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
我的解决方案:
db.myCollection.aggregate([
{
$project: {
items: {
$filter: {
input: "$items",
as: "item",
cond: { $eq: [ "$$item.columns.title", "hahaha" ]}
}
}
}
}
]).pretty()
Run Code Online (Sandbox Code Playgroud)
我的结果:
{
"_id" : 15,
"items" : [
{
"columns" : [ ]
},
{
"columns" : [ ]
}
]
}
Run Code Online (Sandbox Code Playgroud)
预期结果:
{
"_id" : 15,
"items" : [
{
"columns" : [
{
"title" : "hahaha",
"value" : 20
}
]
},
{
"columns" : []
}
]
}
Run Code Online (Sandbox Code Playgroud)
我检查了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 ] }
}
}
}
}
}
}
}
])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1245 次 |
| 最近记录: |