MongoDb数组交集

3

假设我们有

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查询来实现这一点?

有些需求无法在查询中实现。如果这是您的应用程序的一部分,我建议在那里添加功能,而不是尝试为此创建查询。也许您可以在shell上使用javascript来实现它,但这也是编程。 - chaliasos
@WiredPrairie,这很相似,但不是我想要的。无论如何,谢谢。 - ldsenow
如果那不是一个好的匹配,那么抱歉,我认为在MongoDB中没有有效的方法来完成这个任务。 - WiredPrairie
2个回答

2

听起来你可能有更好的实现方式,但是没有更多信息,很难提出高层建议。

这里是一个可以得到你想要的结果的查询:

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

你会注意到它涉及列出你正在搜索的标签对的每个组合,因此对于更大的查询它不会很好地扩展。
编辑:通过使用$all而不是$and来简化查询。

实际上我考虑了这个,但不幸的是列表长度最长为25,而我想至少匹配20%。 - ldsenow
@ldsenow,在你的问题中指出这一点是个好主意。也许如果你从更高的层面上给出你尝试做什么的想法,有人就能帮助你,因为这是只用Mongo查询来完成它的最佳方式。 - Aaron Dufour

-1
如果您想从shell中执行此操作,可以使用JavaScript。创建一个包含以下代码的JavaScript文件:
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

注意:你可以优化它以获得独特的结果。


你可以使用相对简单的Mongo查询来实现这个。 - Pierre-Louis Gottfrois
是的,我看到了...但是如果您在给定的数组中添加一个或两个元素,它会变得更加复杂,不是吗?无论如何,我认为我的答案只是更通用,但不应该被否决。 - chaliasos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接