我有这两个 MongoDB 集合:
系列 A
{ "_id": 1, "field1": "A", "field2": "", "value": 42 }
{ "_id": 2, "field1": "B", "field2": "", "value": 99 }
{ "_id": 3, "field1": "C", "field2": "", "value": 15 }
{ "_id": 4, "field1": "C", "field2": "Z", "value": 15 }
系列 B
{ "_id": 1, "field1": "A", "field2": "", "arrayField": [10, 42, 73] }
{ "_id": 2, "field1": "B", "field2": "", "arrayField": null }
{ "_id": 3, "field1": "C", "field2": "", "arrayField": null }
{ "_id": 4, "field1": "C", "field2": "Z", "arrayField": [99, 15] }
我需要根据field1
、field2
和value
-将 B 连接到 A 上arrayField
;前两个条件必须始终匹配,但第三个条件仅在arrayField
不为空时才需要,否则文档可以通过前两个条件消除歧义。这是我在 Compass 中工作时得到的结果:
[
{
$lookup: {
from: "Collection B",
let: {
value: "$value",
field1: "$field1",
field2: "$field2"
},
pipeline: [
{
$match: {
$expr: {
$and: [
{$eq: ["$field1","$$field1"]},
{$eq: ["$field2","$$field2"]},
{$cond: [
{$ifNull: ["$arrayField",false]},
{$in: ["$$value","$arrayField"]},
true
]}
]
}
}
}
],
as: "result"
}
}
]
这已经足够接近了,但它只匹配 B 中arrayField
不为空的文档。其他两个字段之间的简单匹配将被忽略。我该如何防止这种行为?非常感谢您的任何建议。
实际上,在识别注释中的空值情况方面,您已经非常接近了。您只需将其包装起来,
$ifNull
即可将空值情况和不存在字段的情况都回退到空数组并检查数组大小。在评论中转发游乐场:
蒙戈游乐场