【问题标题】:Querying for an object vs array查询对象与数组
【发布时间】:2017-05-22 06:49:58
【问题描述】:

如何查询文档中的对象与对象数组?

我需要选择所有类似于 Dataset 2 的文档。

数据集 1:

{
    'firstname' : 'John', 
    'lastname': 'Smith', 
    'assistance': [
        {'type': 'Food', 'amount': 20}
    ]
}

数据集 2:

{
    'firstname' : 'John', 
    'lastname': 'Smith', 
    'assistance': {
        'type': 'Food', 
        'amount': 20
    }
}

【问题讨论】:

    标签: arrays mongodb mongodb-query documents


    【解决方案1】:
    db.foo.find( { "assistance" : { $type : 3 } } ); // 3 is bson type for object
    

    将返回文档和

    db.foo.find( { "assistance" : { $type : 4 } } ); // 4 is bson type for object
    

    不会返回这两个文档。

    这是因为在 mongodb 中,在查询数组时,会在整个数组上检查数组元素。

    您可以通过以下方式消除所有辅助类型为数组的元素:

    db.foo.find({"assistance.0" : {$exists : false}})
    

    【讨论】:

      【解决方案2】:

      MongoDB 以 BSON 格式存储数据。

      BSON 代表 二进制 JSON

      BSON 支持文档中值的各种数据类型。

      根据 MongoDB 的文档

      $type 选择字段值为 指定 BSON 类型的实例。

      根据上述文件

      数据集1:辅助字段的数据类型是一个数组。

      Dataset2 : 辅助字段的数据类型是一个对象。

      要仅检索包含辅助键且数据类型为对象的文档,请尝试在 MongoDB shell 中执行以下查询。

      db.collection.find({assistance:{$type:3}})

      有关 BSON 类型的更详细说明,请参阅以下 URL 中提到的文档

      https://docs.mongodb.com/manual/reference/bson-types/

      【讨论】:

        【解决方案3】:

        你可以使用$type,$type对dataset1不起作用,原因是它不检查字段是否为数组,它检查的是字段包含 数组与否。

        但是如果你正在寻找数据集 2,你可以使用 $type 作为对象

        db.whatever.find( { "assistance" : { $type : 3 } } );
        

        db.whatever.find( { "assistance" : { $type : "object" } } );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-05-20
          • 1970-01-01
          • 2022-01-11
          • 2021-09-24
          • 1970-01-01
          • 2023-03-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多