如何在MongoDB聚合框架中按'undefined'值进行匹配?

20

如何搜索具有 undefined 值的字段中的记录,同时进行筛选:

db.records.aggregate({
    $match: {
        myField: "undefined",
    }
})

2
你如何定义未定义?你是指类似$exists的东西吗?如果可能,请添加一个示例文档和一个可以返回它的常规查询。从你的问题来看,'undefined'是一个字符串,就像'Hello, World!'一样。 - ixe013
3个回答

51

$type:6进行过滤,(mongodb参考文档请注意此类型已标记为“已弃用”):

db.records.aggregate({
    $match: {
        myField: {'$type':6},
    }
})

8
谢谢您的询问。接受的答案似乎并没有回答问题,但是这个答案却非常有用,因为如果您尝试搜索“undefined”,它会告诉您搜索无效。我会将其翻译成:感谢这篇回答。虽然被接受的答案似乎没有真正回答问题,但这篇回答却非常有用。如果你尝试搜索“undefined”,会提示你不能搜索。我会尽力保持原文意思不变,并让翻译更容易理解。 - Chris

26

如果您想过滤掉缺少某些字段的文档,请使用$exists操作符。

这在我的机器上可以运行:

> db.test.drop()
true
> db.test.insert( {'Hello':'World!', 'myField':42})
> db.test.insert( {'Hello again':'World!'})
> db.test.aggregate({'$match':{ 'myField':{'$exists':false} }})
{
        "result" : [
                {
                        "_id" : ObjectId("51b9cd2a6c6a334430ec0c98"),
                        "Hello again" : "World!"
                }
        ],
        "ok" : 1
}

包含myField的文档不会显示在结果中。


8
$type 运算符可以用来查询包含 null 值的字段(也有一个已弃用的 undefined 类型)。这个 FAQ 条目解释了如何查询 null 值和/或丢失的字段(聚合框架中也有相同的运算符可用)。例如:db.test.aggregate({'$match':{ 'myField':{'$type':10} }}) 可以匹配那些定义了 myField 字段但其值为 null 的文档。 - jimoleary

1
如果您有存在但未定义的字段,可以使用 null 进行搜索。
db.records.aggregate({
    $match: {
        myField: {$exists: true, $eq: null},
    }
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接