【问题标题】:In MongoDB how do you query for records that contain ONLY certain fields and no others在 MongoDB 中,您如何查询仅包含某些字段而不包含其他字段的记录
【发布时间】:2017-08-05 10:16:32
【问题描述】:

在 MongoDB 中,

要查询包含某些字段的记录,您可以这样做:

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

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

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

【问题讨论】:

标签: mongodb pymongo


【解决方案1】:

对于 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 计为一个字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多