假设我有这样的文件:
{
tags: ['a', 'b']
}
我想查找仅包含标记a
的所有文档。我目前的查询标准是:
{
tags: {
$size: 1,
$in: ['a']
}
}
有没有办法使用equal
运算符进行查询?
答案 0 :(得分:2)
将tags
数组的大小保存为单独的属性,并在修改tags
数组时更新它:
// Document
{
tags : ['a'],
tags_size : 1
}
// Criteria
{ tags_size : 1, tags : 'a' }
请注意,$size
运算符无法使用索引。
答案 1 :(得分:2)
虽然对数组字段的查询会隐式检查数组值,但您也可以匹配整个数组。请考虑以下示例,其中包含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"
中查询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"]
中查询tags
将匹配"a"
字段中仅包含tags
的文档以及包含值{{tags
的任何["a"]
数组1}}(即嵌套数组):
> 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
数组中存储字符串,那么此查询可能比将数组大小存储在单独的字段中并将其添加到查询条件(也是可行的解决方案)更为理想,如马特所说。)