2011-03-20 63 views
140

我现在在使用mongodb。如何检查数组字段是否包含MongoDB中的唯一值或其他数组?

我有blogpost集合,blogpost有一个标签,它是一个数组,例如,

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

我怎样才能做到这些searchs

  1. 包含 '标记1'
  2. 包含[ 'TAG1', '标签2'],
  3. 包含任何[ '标签3' 的,“TAG4 “]

回答

218

尝试了这一点:

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

这是在帮助中详细记录:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24all – 2011-03-20 04:31:23

+2

为$ all是否意味着所有元素AND以表达顺序或是它只是无序? – redben 2011-03-26 14:36:49

+2

@ScottHernandez我没有看到他们提到你用作搜索的领域可以是一个数组,以及如何处理。 “field:{$ in:array}”。在数组数组中搜索数组时会发生什么?未标明。 – Zut 2012-08-14 21:13:30

5

我的经验是,(2)以下的解决方案比一个以“$所有”快多了:

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

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

+1

顺便说一句,只是在索引关键字列表中测试它。与$和和$全部相同的结果 – isox 2013-02-06 13:21:00

+0

也许在此期间随新版本发生变化。 – heinob 2013-02-06 17:26:30

+0

这是间接的。对于“$和”,mongodb做出合乎逻辑的“和”操作。因此,如果第一个表达式是错误的,则不考虑第二个表达式。这意味着更少的处理。 – kubudi 2013-03-16 10:49:02

相关问题