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