【问题标题】:MongoDb array intersectionMongoDb 数组交集
【发布时间】:2013-07-02 06:45:27
【问题描述】:

假设我们有

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 来实现它,但这也是编程。
  • @WiredPrairie 它很相似,但确实是我想要的。还是谢谢
  • 如果这不是一个很好的匹配,那么抱歉,我认为在 MongoDB 中没有一种有效的方法。

标签: mongodb


【解决方案1】:

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

这里有一个查询,可以得到你要找的东西:

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

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

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

【讨论】:

  • 其实我也想过这个,但不幸的是列表的长度最多为 25,我想匹配至少 20%。
  • @ldsenow 在您的问题中指出这是一件好事。也许如果您从更高的层次了解您正在尝试什么,有人将能够提供帮助,因为这是仅在 Mongo 查询中执行此操作的最佳方式。
【解决方案2】:

如果您想从 shell 执行此操作,您可以使用 javascript。使用以下代码创建一个 javascopt 文件:

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查询来实现这一点
  • 是的,我看到了......但是如果你在给定的数组中添加一两个更多元素,它会变得更加复杂,不是吗?无论如何,我认为我的答案更笼统,但投反对票并没有错。
猜你喜欢
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 2016-03-18
  • 2023-04-10
  • 1970-01-01
相关资源
最近更新 更多