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
操作符。