Mongodb mongo$过滤器和子数组中的多个条件
我有这部分收藏:Mongodb mongo$过滤器和子数组中的多个条件,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有这部分收藏: [{ "_id": ObjectId("604f3ae3194f2135b0ade569"), "parameters": [ { "_id": ObjectId("602b7455f4b4bf5b41662ec1"), "name": "Purpose", "options&q
[{
"_id": ObjectId("604f3ae3194f2135b0ade569"),
"parameters": [
{
"_id": ObjectId("602b7455f4b4bf5b41662ec1"),
"name": "Purpose",
"options": [
{
"id": ObjectId("602b764ff4b4bf5b41662ec2"),
"name": "debug",
"sel": true
},
{
"id": ObjectId("602b767df4b4bf5b41662ec3"),
"name": "performance",
"sel": false
},
{
"id": ObjectId("602b764ff4b4bf5b41662ec4"),
"name": "security",
"sel": true
},
{
"id": ObjectId("602b767df4b4bf5b41662ec5"),
"name": "Not Applicable",
"sel": false
}
],
"type": "multiple"
}]
}]
此查询:
db.testCollection.aggregate([
{ $unwind: "$parameters" },
{
$match: {
"parameters._id": ObjectId("602b7455f4b4bf5b41662ec1"),
}
},
{
$addFields: {
match: {
$filter: {
input: "$parameters.options",
as: "option",
cond: {
$and: [
{ $eq: ["$$option.id", ObjectId('602b764ff4b4bf5b41662ec2')] },
{ $eq: ["$$option.sel", true] }
]
}
}
}
}
}
])
结果是一个新的数组匹配,在本例中
"match": [
{
"id": ObjectId("602b764ff4b4bf5b41662ec2"),
"name": "debug",
"sel": true
}
]
如何匹配,例如,对于集合,匹配
"id": ObjectId("602b764ff4b4bf5b41662ec2") and
"id": ObjectId("602b764ff4b4bf5b41662ec4")
是否有一个包含两个或两个结果或为空的结果数组?我不确定在
$filter
中的单个条件下是否可能,但您可以尝试使用$let
来声明一个名为$let
的变量,并存储过滤结果filtered
检查过滤元素大小是否为2的条件,然后返回过滤结果,否则返回空白数组$in
- 您必须在
条件下将与筛选器中的ID数相匹配的号码放入筛选器中$eq
尝试$in操作符而不是$eq,
{$in:[“$$option.id”、[ObjectId(“602b764ff4b4bf5b41662ec2”)、ObjectId(“602B764FF4BF5B41662EC4”)]}
Hi@turivishal,我成功了。它可以工作,但如果我选择一个假id(例如ObjectId(“602b767df4b4bf5b41662ec3”)),则新数组中的结果只有第一个匹配项。我希望它没有匹配。
{
$addFields: {
match: {
$let: {
vars: {
filtered: {
$filter: {
input: "$parameters.options",
as: "option",
cond: {
$and: [
{
$in: [
"$$option.id",
[ObjectId("602b764ff4b4bf5b41662ec2"), ObjectId("602b767df4b4bf5b41662ec3")]
]
},
{ $eq: ["$$option.sel", true] }
]
}
}
}
},
in: {
$cond: [
{ $eq: [{ $size: "$$filtered" }, 2] },
"$$filtered",
[]
]
}
}
}
}
}