假设我有这样的文件:
{
tags: ['a', 'b']
}
我想找到所有只有标签的文档a
。我目前的查询条件是:
{
tags: {
$size: 1,
$in: ['a']
}
}
有没有办法使用equal
运算符进行查询?
假设我有这样的文件:
{
tags: ['a', 'b']
}
我想找到所有只有标签的文档a
。我目前的查询条件是:
{
tags: {
$size: 1,
$in: ['a']
}
}
有没有办法使用equal
运算符进行查询?
尽管对数组字段的查询会隐式检查数组值,但您也可以匹配整个数组。tags
考虑以下示例,该示例在字段中混合了字符串和字符串数组:
> db.foo.find()
{ "_id" : ObjectId("502943541f5b0d2bca9663a8"), "tags" : [ "a" ] }
{ "_id" : ObjectId("502943581f5b0d2bca9663a9"), "tags" : [ "a", "b" ] }
{ "_id" : ObjectId("5029435e1f5b0d2bca9663aa"), "tags" : [ [ "a" ] ] }
{ "_id" : ObjectId("502943641f5b0d2bca9663ab"), "tags" : [ [ "a" ], "b" ] }
{ "_id" : ObjectId("5029436c1f5b0d2bca9663ac"), "tags" : [ [ "a" ], [ "b" ] ] }
{ "_id" : ObjectId("502943a31f5b0d2bca9663ad"), "tags" : [ "a", [ "b" ] ] }
查询"a"
in将匹配任何单独或部分tags
包含的数组:"a"
> db.foo.find({tags: "a"})
{ "_id" : ObjectId("502943541f5b0d2bca9663a8"), "tags" : [ "a" ] }
{ "_id" : ObjectId("502943581f5b0d2bca9663a9"), "tags" : [ "a", "b" ] }
{ "_id" : ObjectId("502943a31f5b0d2bca9663ad"), "tags" : [ "a", [ "b" ] ] }
虽然没有显示,但如果我们有一个tags
简单的字段"a"
(不是数组,而是字符串值),它肯定也会被匹配。
查询["a"]
intags
将匹配仅包含"a"
在其tags
字段中的文档以及tags
包含该值的任何数组["a"]
(即嵌套数组):
> db.foo.find({tags: ["a"]})
{ "_id" : ObjectId("502943541f5b0d2bca9663a8"), "tags" : [ "a" ] }
{ "_id" : ObjectId("5029435e1f5b0d2bca9663aa"), "tags" : [ [ "a" ] ] }
{ "_id" : ObjectId("502943641f5b0d2bca9663ab"), "tags" : [ [ "a" ], "b" ] }
{ "_id" : ObjectId("5029436c1f5b0d2bca9663ac"), "tags" : [ [ "a" ], [ "b" ] ] }
如果您可以安全地假设您的架构只会将字符串存储在其tags
数组中,则此查询可能比将数组大小存储在单独的字段中并将其添加到您的查询条件中更可取(这也是一个可行的解决方案,如 Matt 所述)。
将数组的大小保存tags
为单独的属性,并在修改tags
数组时更新它:
// Document
{
tags : ['a'],
tags_size : 1
}
// Criteria
{ tags_size : 1, tags : 'a' }
请注意,$size
操作员无法使用索引。