查询对象和数组的区别

3

如何查询文档中的一个对象而不是对象数组?

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

数据集1:

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

数据集2:

{
    'firstname' : 'John', 
    'lastname': 'Smith', 
    'assistance': {
        'type': 'Food', 
        'amount': 20
    }
}
3个回答

0

MongoDB以BSON格式存储数据。

BSON代表二进制JSON

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

根据MongoDB的文档

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

根据上述文档

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

数据集2:辅助字段的数据类型是对象。

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

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

有关BSON类型的更详细描述,请参阅下面URL中提到的文档。

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


0

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

但是如果你要查找dataset2,你可以使用$type来表示对象。

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

或者

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

0
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}})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接