假设我的结构为;
{
"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"
}
]
}
我想要项目
列出
其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":“表达式 $in 恰好需要 2 个参数。传入了 1 个参数。”
我错过了什么?
最佳答案
使用 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/