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

MongoDB:按值和运算符搜索数组,mongodb,Mongodb,假设我有这样一个文档: { tags: ['a', 'b'] } 我想查找所有只有标签a的文档。我当前的查询条件是: { tags: { $size: 1, $in: ['a'] } } 有没有一种方法可以使用equal操作符进行查询?将标签数组的大小保存为一个单独的属性,并在修改标签数组时进行更新: // Document { tags : ['a'], tags_size : 1 } // Criteria { tags_size : 1, tags

假设我有这样一个文档:

{
  tags: ['a', 'b']
}
我想查找所有只有标签
a
的文档。我当前的查询条件是:

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

有没有一种方法可以使用
equal
操作符进行查询?

标签
数组的大小保存为一个单独的属性,并在修改
标签
数组时进行更新:

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

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

请注意,
$size
运算符无法使用索引。

标记
数组的大小保存为一个单独的属性,并在修改
标记
数组时进行更新:

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

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

请注意,
$size
运算符无法使用索引。

尽管对数组字段的查询会隐式检查数组值,但您也可以匹配整个数组。考虑下面的例子,它在<>代码>标签>代码>字段:

中有字符串和字符串数组的混合
> 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”
将匹配单独或部分包含
“a”
的任何数组:

> db.foo.find({tags: "a"})
{ "_id" : ObjectId("502943541f5b0d2bca9663a8"), "tags" : [ "a" ] }
{ "_id" : ObjectId("502943581f5b0d2bca9663a9"), "tags" : [ "a", "b" ] }
{ "_id" : ObjectId("502943a31f5b0d2bca9663ad"), "tags" : [ "a", [ "b" ] ] }
虽然没有显示,但是如果我们有一个
标记
字段,它仅仅是
“a”
(不是数组,而是字符串值),那么它肯定也会匹配

标签
中查询
[“a”]
将匹配其
标签
字段中仅包含
“a”
的文档以及包含值
[“a”]
的任何
标签
数组(即嵌套数组):


如果您可以安全地假设您的模式将只在其
标记
数组中存储字符串,则此查询可能比将数组大小存储在单独的字段中并将其添加到查询条件中更可取(如Matt所述,这也是一个可行的解决方案)。

尽管对数组字段的查询会隐式检查数组值,您还可以匹配整个阵列。考虑下面的例子,它在<>代码>标签>代码>字段:

中有字符串和字符串数组的混合
> 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”
将匹配单独或部分包含
“a”
的任何数组:

> db.foo.find({tags: "a"})
{ "_id" : ObjectId("502943541f5b0d2bca9663a8"), "tags" : [ "a" ] }
{ "_id" : ObjectId("502943581f5b0d2bca9663a9"), "tags" : [ "a", "b" ] }
{ "_id" : ObjectId("502943a31f5b0d2bca9663ad"), "tags" : [ "a", [ "b" ] ] }
虽然没有显示,但是如果我们有一个
标记
字段,它仅仅是
“a”
(不是数组,而是字符串值),那么它肯定也会匹配

标签
中查询
[“a”]
将匹配其
标签
字段中仅包含
“a”
的文档以及包含值
[“a”]
的任何
标签
数组(即嵌套数组):


如果您可以安全地假设您的模式将只在其
标记
数组中存储字符串,那么此查询可能比将数组大小存储在单独的字段中并将其添加到查询条件中更可取(这也是一个可行的解决方案,如Matt所述)。

是的,但要尽量避免这种情况。我宁愿在
操作符中使用
$in。是的,但要尽量避免。我宁愿只使用
$in
操作符。