如何在MongoDB中查找一个对象数组和集合之间的交集?

3

给定一个Mongo集合,其中数据的格式如下:

// 'Entities'
{ tags: [{ a: '1', b: '1' }, { a: '2', b: '3' }] }
{ tags: [{ a: '1', b: '2' }, { a: '2', b: '3' }] }
{ tags: [{ a: '4', b: '4' }, { a: '4', b: '5' }, { a: '6', b: '7' }] }

我希望找到所有 'tag' 条目包含以下任何对象的文档:
[{ a: '1', b: '1' }, { a: '4', b: '4' }]

使用示例数据,这将匹配第一个和第三个元素:

{ tags: [{ a: '1', b: '1' }, { a: '2', b: '3' }] }
{ tags: [{ a: '4', b: '4' }, { a: '4', b: '5' }, { a: '6', b: '7' }] }

目前我是通过生成的查询(JS)来执行此操作:

entities.find({
    $or: tags.map(tag => ({
      tags: { $elemMatch: tag },
    })
})

但这种方法效率非常低下,如果我要搜索的标签数量很多,那么我基本上将运行数百个单独的查询。有更好的方法吗?


也许可以这样:https://mongoplayground.net/p/xpJGliuOKEr - R2D2
2个回答

1

或许可以嵌套$or

(我不确定你的数据结构,但显然tagsapprovers的一个属性?)

find({
  'approvers.tags': {
    '$elemMatch': {
      $or: [
        { a: '1', b: '1' },
        { a: '4', b: '4' }
      ]
    }
  }
});

mongoplayground


1

看起来你可以使用$in运算符,这应该在大规模情况下提供更好的性能(以及更干净的代码)。

db.collection.find({
  approvers: {
    $in: tags
  }
})

Mongo Playground


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