gpt4 book ai didi

mongodb - mongodb 查询中的 $project 和 $in

转载 作者:可可西里 更新时间:2023-11-01 10:16:06 27 4
gpt4 key购买 nike

假设我的结构为;

{
"class" : "TESTCLASS",
"id" : "HyvF1sdZl",
"depends" : [
"S11T5ce",
"BytQLN6ml",
"Byzz8Ea7l",
"r1TUNX58x"
],
"list" : [
{
"class" : "DATA",
"id" : "H113d5Pwx"
},
{
"class" : "DATA",
"id" : "H113d5Pwx"
},
{
"class" : "TEST",
"id" : "r1TUNX58x"
},
{
"class" : "DATA",
"id" : "H113d5Pwx"
},
{
"class" : "TEST",
"id" : "r1TUNX58x"
},
{
"class" : "TEST",
"id" : "r1TUNX58x"
},
{
"class" : "FDSAFAS",
"id" : "S11T5ce"
},
{
"class" : "YENITEST",
"id" : "r1TUNX58x"
},
{
"class" : "FDSAFAS",
"id" : "S11T5ce"
},
{
"class" : "CALENDAR",
"id" : "S11T5ce"
},
{
"class" : "EN",
"id" : "BytQLN6ml"
},
{
"class" : "CALENDAR",
"id" : "S11T5ce"
},
{
"class" : "EN_",
"id" : "Byzz8Ea7l"
},
{
"class" : "TEST",
"id" : "r1TUNX58x"
},
{
"class" : "EN",
"id" : "BytQLN6ml"
},
{
"class" : "FDSAFAS",
"id" : "S11T5ce"
}
]
}

我想project list 项目,其id 包含在depends 数组中。

我的意思是,我只想得到;

"depends" : [
"S11T5ce",
"BytQLN6ml",
"Byzz8Ea7l",
"r1TUNX58x"
],
"list" : [
{
"class" : "FDSAFAS",
"id" : "S11T5ce"
},
{
"class" : "EN",
"id" : "BytQLN6ml"
},
{
"class" : "EN_",
"id" : "Byzz8Ea7l"
},
{
"class" : "TEST",
"id" : "r1TUNX58x"
}

]

为了能够做到这一点,我写了;

db.definition.aggregate([
{
$project: {
_id: 0,
depends :1,
depends: {$in: ["$list.id"]},
"list.defid": 1,
"list.class" :1,
}

}
]).pretty()

但这会引发错误,如 "errmsg": "Expression $in takes exactly 2 arguments. 1 were passed in."

我错过了什么?

最佳答案

对于 MongoDB 3.4,您可以使用 $addFields 管道来投影其他字段而不明确命名它们。作为单个管道,使用 $setUnion 的组合, $filter $in 运算符返回所需的大批。 <强> $setUnion 运算符有助于在应用 $filter 之前消除重复项 运算符。

为了遵循直觉,让我们按照这个仅使用 $filter 运行的示例管道进行操作 运算符:

db.collection.aggregate([
{
"$addFields": {
"list": {
"$filter": {
"input": "$list",
"as": "item",
"cond": { "$in": ["$$item.id", "$depends"] }
}
}
}
}
])

示例输出

{
"_id" : ObjectId("58d0e0d97a3871921504bb69"),
"class" : "TESTCLASS",
"id" : "HyvF1sdZl",
"depends" : [
"S11T5ce",
"BytQLN6ml",
"Byzz8Ea7l",
"r1TUNX58x"
],
"list" : [
{
"class" : "TEST",
"id" : "r1TUNX58x"
},
{
"class" : "TEST",
"id" : "r1TUNX58x"
},
{
"class" : "TEST",
"id" : "r1TUNX58x"
},
{
"class" : "FDSAFAS",
"id" : "S11T5ce"
},
{
"class" : "YENITEST",
"id" : "r1TUNX58x"
},
{
"class" : "FDSAFAS",
"id" : "S11T5ce"
},
{
"class" : "CALENDAR",
"id" : "S11T5ce"
},
{
"class" : "EN",
"id" : "BytQLN6ml"
},
{
"class" : "CALENDAR",
"id" : "S11T5ce"
},
{
"class" : "EN_",
"id" : "Byzz8Ea7l"
},
{
"class" : "TEST",
"id" : "r1TUNX58x"
},
{
"class" : "EN",
"id" : "BytQLN6ml"
},
{
"class" : "FDSAFAS",
"id" : "S11T5ce"
}
]
}

随着 $setUnion 运算符,在应用 $filter 之前先消除重复项 作为:

db.collection.aggregate([
{
"$addFields": {

"list": {
"$filter": {
"input": { "$setUnion": ["$list", []] },
"as": "item",
"cond": { "$in": ["$$item.id", "$depends"] }
}
}
}
}
])

示例输出

{
"class" : "TESTCLASS",
"id" : "HyvF1sdZl",
"depends" : [
"S11T5ce",
"BytQLN6ml",
"Byzz8Ea7l",
"r1TUNX58x"
],
"list" : [
{
"class" : "FDSAFAS",
"id" : "S11T5ce"
},
{
"class" : "TEST",
"id" : "r1TUNX58x"
},
{
"class" : "YENITEST",
"id" : "r1TUNX58x"
},
{
"class" : "EN_",
"id" : "Byzz8Ea7l"
},
{
"class" : "CALENDAR",
"id" : "S11T5ce"
},
{
"class" : "EN",
"id" : "BytQLN6ml"
}
]
}

关于mongodb - mongodb 查询中的 $project 和 $in,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42920255/

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