MongoDb数组交集

时间:2013-07-01 15:08:29

标签: 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查询来实现这一目标?

2 个答案:

答案 0 :(得分:2)

听起来可能有更好的方法来实施您尝试做的事情,但如果没有更多信息,很难提出高级别的建议。

以下是一个可以获取您正在寻找的内容的查询:

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

您会注意到它涉及列出您正在搜索的标记对的每个组合,因此它不会很好地扩展到较大的查询。

修改:使用$all代替$and简化了查询。

答案 1 :(得分:-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

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