在MongoDB中,
要查询包含某些字段的记录,您可以执行以下操作:
collection.find({'field_name1': {'$exists': true}})
这将返回任何设置了'field_name1'字段的记录...
但是,如何查询mongo以查找仅包含'field_name1'(而不包含其他字段)的记录?我希望能够为一个字段列表执行此操作。
答案 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
计为字段。