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

y1aodyip  于 2022-11-03  发布在  Go
关注(0)|答案(2)|浏览(188)

给定一个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 },
    })
})

但是这看起来效率很低,因为如果我搜索的标签数量很大,我将基本上运行数百个单独的查询。有更好的方法吗?

piok6c0g

piok6c0g1#

看起来你可以使用$in操作符来代替,这应该会在大规模上给予更好的性能(和更干净的代码)。

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

Mongo Playground

x4shl7ld

x4shl7ld2#

也许嵌套了$or
(我不确定您的数据的形状,但显然tagsapprovers的一个属性?)

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

mongoplayground

相关问题