查询对象与数组

Querying for an object vs array

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

我需要 select 所有类似于数据集 2 的文档。

数据集 1:

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

数据集 2:

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

你可以使用 $type ,$type 不适用于 dataset1,原因是它不检查字段是否为数组,它检查的是字段 是否包含个数组

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

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

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

MongoDB 以 BSON 格式存储数据。

BSON代表二进制JSON.

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

根据 MongoDB

的文档

$type selects the documents where the value of the field is an instance of the specified BSON type.

根据上述文件

Dataset 1:Datatype of assistance field is an array.

Dataset2 : Datatype of assistance field is an object.

要仅检索包含以对象作为数据类型的辅助密钥的文档,请尝试在 MongoDB shell.

中执行以下查询

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

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

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

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

将 return 文档和

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

将returnnone两个文件.

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

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

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