如何检查数组字段在MongoDB中是否包含唯一值或另一个数组?


143

我现在正在使用mongodb。

我有博客文章集,博客文章中有一个标记数组,例如数组

blogpost1.tags = ['tag1', 'tag2', 'tag3', 'tag4', 'tag5']
blogpost2.tags = ['tag2', 'tag3']
blogpost3.tags = ['tag2', 'tag3', 'tag4', 'tag5']
blogpost4.tags = ['tag1', 'tag4', 'tag5']

我如何进行这些搜索

  1. 包含“ tag1”
  2. 包含['tag1','tag2'],
  3. 包含['tag3','tag4']中的任何一个

Answers:


219

试试看:

db.blogpost.find({ 'tags' : 'tag1'}); //1
db.blogpost.find({ 'tags' : { $all : [ 'tag1', 'tag2' ] }}); //2
db.blogpost.find({ 'tags' : { $in : [ 'tag3', 'tag4' ] }}); //3

6
帮助中有很好的记录:mongodb.org/display/DOCS/…–
Scott Hernandez

2
对于$ all,它表示所有元素都按表示的顺序AND还是只是无序的?
redben 2011年

2
@ScottHernandez我看不到他们提到您在搜索中使用的字段可以是数组以及如何处理它。“字段:{$ in:数组}”。在数组数组中搜索数组时会发生什么?未标明。
Zut 2012年

我们可以在数组上做任何索引以停止重复吗?如果是,请指导如何。
Hitesh Joshi 2012年

1
@redben像文档中写的那样无序:$ all运算符DOCS。只需阅读示例部分,您将看到。
Matthias B

5

我的经验是,对于(2),以下解决方案比带有“ $ all”的解决方案要快得多:

db.blogpost.find({ $and: [ {tags: 'tag1'} ,{tags: 'tag2'} ] });

但说实话,我也不是为什么。如果有人知道的话,我会感兴趣的。


1
顺便说一句,只是在索引关键字列表上对其进行了测试。$ and和$ all的结果完全相同
isox

也许与此同时随着新版本的改变。
heinob

这是偶然的。对于“ $ and”,mongodb进行逻辑的“ and”操作。因此,如果第一个表达式为假,则不考虑第二个表达式。这意味着更少的处理。
kubudi

但这也应该与“ $ all”一起发生,不是吗?
heinob

1
$ all可能是对索引的两次查询,$ and可能是对结果进行顺序扫描的一次查询。
埃文·卡罗尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.