我有这些实体:
// collectionA
{
key: "value",
ref: SOME-OBJECT-ID
}
// collectionB
{
_id: SOME-OBJECT-ID
key1: "value1"
}
我希望如果ref存在于collectionA实体中,它将在collectionB上查找它并带来它的数据。
如果ref键丢失或没有丢失但collectionB中的实体丢失,则我从所有聚合查询中获得空结果。
这是聚合查询:
{ $match },
{
$lookup: {
from: "collectionB",
let: {
ref: "$ref"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$_id", "$$ref"
]
}
}
},
{
$project: {
key1: 1
}
}
],
as: "someData"
}
}
如何避免这种情况或添加任何条件$lookup?
3条答案
按热度按时间f0brbegy1#
一种方法是在开始处添加另一个
match
,以跳过source
要跳过
B
,可以在末尾省略。它将只考虑
ref
现有文档。play
但如果没有特定的用例,则不需要这样做,因为它不会产生太大影响。
tpgth1q72#
我找到了文档没有被选中,因为我使用了
$unwind
-如果我们试图在空数组上执行此操作,它将不会返回文档。这就是解决办法而不是:
我从这个答案中找到了
preserveNullAndEmptyArrays
How to get all result if unwind field does not exist in mongodbaxr492tv3#
如果本地字段不存在,则应该在
lookup
的子查询管道中匹配零个文档。可以通过使用$cond
操作符并将null
传递给$match
stage(如果字段不存在,则$type
操作符返回'missing'
)来实现:一个相关的答案是here。