在MongoDB中,如何查询仅包含某些字段而不包含其他字段的记录

时间:2012-11-01 22:05:49

标签: mongodb pymongo

在MongoDB中,

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

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

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

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

1 个答案:

答案 0 :(得分:3)

令人遗憾的答案,正如您经常在MongoDB和其他NoSQL数据库中找到的那样,最好以一种允许您尽可能简单地查询数据的方式构建数据。

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

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

可悲的是,我的JavaScript-fu有点弱,所以我不知道如何(或者如果)你可以在单行中获得JS中一个对象成员的数量,所以要做到这一点,我会store a function server side

从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计为字段。