假设我有 7 个这样的文档:
// with content.id
{
"_id" : 1, // I know it will be ObjectId but for simplicity here I'll set it as int
"content" : {"id" : 1, "title" : "some title"}
}
// without content.id
{
"_id" : 2,
"content" : {"title" : "some title"}
}
// with content.id equal to null
{
"_id" : 3,
"content" : {"id" : null, "title" : "some title"}
}
// with empty content object
{
"_id" : 4,
"content" : {}
}
// with content as an empty array
{
"_id" : 5,
"content" : []
}
// with content equal to null
{
"_id" : 6,
"content" : null
}
// without content
{
"_id" : 7,
}
我需要获取所有记录,而在我们的案例中,我们没有除content.id
记录 1 之外的所有记录。
我尝试过
collection.find({"content.id" : null});
它不返回正确的记录 1,但也不返回 id 为 5 的记录,其中content
设置为空数组
另外,我尝试过
collection.find({"content.id" : {"$exists" : false}});
在这种情况下,它返回 id 为 5 的记录,但不返回 id 为 3 的记录,该记录content.id
存在但设置为 null。
我发现查询可以与两者的组合一起使用,如下所示
collection.find({ "$or" : [{"content.id" : {"$exists" : false}} , {"content.id" : null}]});
但这样的查询运行速度有点慢:(
有没有更好的方法来涵盖上述所有情况?
您可能会问为什么我要同时涵盖content: {}
和content: []
?因为 PHP 有时会将空数组转换为对象,但有时会转换为空数组,以免出现任何问题,我想涵盖这两种情况。
您可以使用
$ifNull
except涵盖所有情况[]
。因此只需用作覆盖案例 5 的[]
替代品即可。$ifNull
蒙戈游乐场