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