1

假设我有这样的文件:

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

我想找到所有只有标签的文档a。我目前的查询条件是:

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

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

4

2 回答 2

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"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 所述)。

于 2012-08-13T18:23:05.180 回答
2

将数组的大小保存tags为单独的属性,并在修改tags数组时更新它:

// Document
{
  tags : ['a'],
  tags_size : 1
}

// Criteria
{ tags_size : 1, tags : 'a' }

请注意,$size操作员无法使用索引。

于 2012-08-12T23:59:53.457 回答