3

在 MongoDB 中,

要查询包含某些字段的记录,您可以执行以下操作:

collection.find({'field_name1': {'$exists': true}})

这将返回任何设置了“field_name1”字段的记录......

但是您如何查询 mongo 以查找仅包含“field_name1”(且不包含其他字段)的记录?我希望能够为字段列表执行此操作。

4

1 回答 1

3

正如您在 MongoDB 和其他 NoSQL 数据库中经常发现的那样,可悲的答案可能是,最好以一种允许您尽可能简单地查询数据的方式来构建您的数据。

也就是说,有很多方法可以做到这一点,但据我所知,它需要你在服务器端执行 JavaScript。这会很慢,并且不可能利用 MongoDB 的索引和其他逻辑特性,所以只有在绝对必要时才使用它,如果性能非常重要的话。

因此,最简单的方法可能是创建一个返回对象中字段数量的函数,我们可以将其与$where 查询语法一起使用。这允许您对数据运行任意 JavaScript 查询,并且可以与普通语法查询结合使用。

可悲的是,我的 JavaScript-fu 有点弱,所以我不知道如何(或是否)可以在单行中获取 JS 中对象的成员数,所以要做到这一点,我会存储一个功能服务器端

在 mongo shell 中,执行以下命令:

db.system.js.save(
    {
        "_id" : "countFields", 
        "value" : function(x) { i=0; for(p in x) { i++; } return i}
    }
)

有了这个,你就有了一个保存的 JavaScript 函数,服务器端,调用countFields它返回对象中元素的数量。现在,您需要使用$where查询执行查找操作:

db.collection.find({
    'field_name1': {'$exists': True}, 
    '$where' : 'countFields(this)==2'
})

这将只为您提供同时满足$exists条件和$where条款的文件。请注意,我在示例中与 2 进行比较,因为该countFields函数算作_id一个字段。

于 2012-11-01T22:42:53.917 回答