在 MongoDB 中展开查找操作的结果时丢失记录

tor*_*ard 2 mongodb mongodb-query

我在我的“预订”表上收到了一个很长的查询,它的效果很好,除非我询问代理。

我们有一张“用户”表。该表包含用户、管理员、代理等。

“预订”总是有一个“用户”,因此 $lookup 总是顺利进行。

“预订”有时有一个“代理”,但大多数时候该字段为空白“”。因此,当我执行 $lookup 时,它会破坏整个查询并且不返回任何内容。

我想做 $lookup,但前提是“代理”字段不为空。或者找到一种方法,以便如果 $lookup 失败,它不会破坏整个查询。

左侧是实际上有一个包含有效 users._id 的“agent”字段 - 这里我们得到结果

右侧是“代理”字段缺失、包含空白值或包含无效值的情况。- 这里它破坏了整个查询。

在此输入图像描述

这是一个带有数据的示例来尝试一下

db.getCollection('booking').aggregate([
    {
        $match: {
            property: "001",
            checkin: {$gte: 1483596800},
            checkout: {$lte: 1583596800}
        }
    },
    {
        $lookup: {
            from: "users",
            localField: "user",
            foreignField: "_id",    
            as: "users"     
        }   
    },
    { $unwind: "$users" },
    {
        $lookup: {
            from: "users",
            localField: "agent",
            foreignField: "_id",    
            as: "agent"     
        }   
    },
    { $unwind: "$agent"} 
])



booking Table
{
    "_id" : "AAAAA",
    "property" : "001",
    "user" : "U001",
    "agent" : "A001",
    "checkin" : 1493596800,
    "checkout" : 1494374400,
    "test" : "This one will always work"
}
{
    "_id" : "BBBBB",
    "property" : "001",
    "user" : "U001",
    "agent" : "",
    "checkin" : 1493596800,
    "checkout" : 1494374400,
    "test" : "This one has blank agent and does not work"
}
{
    "_id" : "CCCCC",
    "property" : "001",
    "user" : "U001",
    "checkin" : 1493596800,
    "checkout" : 1494374400,
    "test" : "This one has no agent and does not work"
}
{
    "_id" : "DDDDD",
    "property" : "001",
    "user" : "U001",
    "agent" : "XXXX",
    "checkin" : 1493596800,
    "checkout" : 1494374400,
    "test" : "This one has invalid agent and does not work"
}


users Table 
{
    "_id" : "U001",
    "name" : "I am USER"
}
{
    "_id" : "A001",
    "name" : "I am AGENT"
}
Run Code Online (Sandbox Code Playgroud)

bur*_*ete 6

当您将结果$lookup通过$unwind管道传输到查找结果数组所在的结果字段时,就会出现问题,查找操作的空结果将通过展开而被删除,从而发生数据丢失。回溯你的聚合逻辑并preserveNullAndEmptyArrays为有罪的$unwind步骤添加选项。这将阻止该步骤中记录的丢失,从而解决您的问题。