2013-07-01 27 views
3

假设我们有MongoDB的阵列路口

post1.tags = [ '1', '2', '3' ]; 

post2.tags = [ '2', '4', '5' ]; 

post3.tags = [ '1', '3', '4' ]; 

post4.tags = [ '1', '3', '4', '5', '6' ]; 

我试图找到其包含2个或多个指定标签的帖子[“1”,“3”,“5”。 结果应该是post1,post3和post4。如何写一个mongodb查询来实现这一点?

+0

有些要求不能在查询中实现。如果这是你的应用程序的一部分,我建议在其中添加功能,而不是试图为此创建查询。也许你可以在shell上用javascript实现它,但这也是编程。 – Schaliasos

+2

可能的重复[如何检查数组字段是否是MongoDB中另一个数组的一部分?](http://stackoverflow.com/questions/15635658/how-to-check-if-an-array-field-is -a-part-of-another-array-in-mongodb) – WiredPrairie

+0

@WiredPrairie它是相似的,但真的是我想要的。无论如何感谢 – ldsenow

回答

-1

如果你想从shell中做到这一点,你可以使用JavaScript。用下面的代码创建一个javascropt文件:

use test; 

var initialArray = [1, 2, 3]; 

for (i = 0; i < initialArray.length; i++) { 
    for(j = initialArray.length-1; j>=i; j--) { 
     if(i!=j) { 
      var matchingArray = [initialArray[i].toString(), initialArray[j].toString()]; 
      print("\nResults using array: " + matchingArray); 

      var result = db.posts.find({tags: {$all: matchingArray}}); 

      while(result.hasNext()){ 
       printjson(result.next()); 
      } 
     } 
    } 
} 

,然后运行命令

C:\> mongo < query.js 

注意:您可以对其进行优化来获得独特的效果。

+0

你可以用一个相对简单的mongo查询来实现这个 –

+0

是的,我看到了......但是如果你在给定的数组中添加一个或两个以上的元素,它会变得更加复杂,不是吗?无论如何,我认为我的答案只是更通用,但它是downvoting没有错。 – Schaliasos

+0

是的,数据模式应该更好我猜:( –

2

听起来好像可能有更好的方法来实现你想要做的事情,但没有更多的信息,很难提出高层次的建议。

下面是一个查询,将让你在寻找什么:

{ 
    $or: 
    [ 
     { 
     tags: 
      { 
      $all: ['1', '3'] 
      } 
     }, 
     { 
     tags: 
      { 
      $all: ['3', '5'] 
      } 
     }, 
     { 
     tags: 
      { 
      $all: ['1', '5'] 
      } 
     } 
    ] 
} 

你会发现,它涉及到上市对您正在搜索标签的每个组合,因此它赢得了”吨扩展到更大的查询。

编辑:通过使用$all而不是$and来简化查询。

+0

其实我想过这个,但不幸的是,列表的长度是多达25,我想匹配至少20%。 – ldsenow

+0

@ldsenow这将是一件好事在你的问题中指出,也许如果你从更高的层次上了解你正在尝试的是什么,那么有人可以提供帮助,因为这是在Mongo查询中完成的最好方法。 –