gpt4 book ai didi

mongodb - 过滤子文档数组字段中的数组

转载 作者:可可西里 更新时间:2023-11-01 09:24:06 25 4
gpt4 key购买 nike

我正在尝试从 MongoDB 中的数组中获取一个元素。我认为聚合过滤器是适用的。但是我已经尝试了百万次,我仍然找不到问题出在哪里。你能 Handlebars 给我吗?

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 聚合管道阶段执行此操作,以便在需要时自动将所有其他字段包含在查询结果中。

您也可以像以前一样用 $project 替换 $addFields 阶段,但在这种情况下,您需要明确包含所有其他字段。

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

关于mongodb - 过滤子文档数组字段中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41834567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com