MongoDB:按值和运算符搜索数组

时间:2012-08-12 23:53:53

标签: mongodb

假设我有这样的文件:

{
  tags: ['a', 'b']
}

我想查找仅包含标记a的所有文档。我目前的查询标准是:

{
  tags: {
    $size: 1,
    $in: ['a']
  }
}

有没有办法使用equal运算符进行查询?

2 个答案:

答案 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数组中存储字符串,那么此查询可能比将数组大小存储在单独的字段中并将其添加到查询条件(也是可行的解决方案)更为理想,如马特所说。)