如何检查数组字段是否是MongoDB中另一个数组的一部分?

xurqigkl  于 2023-04-29  发布在  Go
关注(0)|答案(3)|浏览(378)

在这个question中,Jeff the Bear解释了如何使用数组搜索文档

contains 'tag1'
contains ['tag1','tag2'],
contains any of ['tag3', 'tag4']

但是,如果我想用一个数组搜索文档,而该数组是另一个数组的一部分,我该怎么办?

post1.tags = ['tag1']
post2.tags = ['tag1','tag3']
post3.tags = ['tag2','tag4']
post4.tags = ['tag1','tag2','tag3','tag4']

我想得到post1和post3,因为它们有标签

contained in ['tag1', 'tag2', 'tag4']

我不想得到post2和post4,因为tag3在['tag1', 'tag2', 'tag4']中不存在
换句话说,选择其tags数组中的所有元素都可以在另一个条件数组中找到的posts

rxztt3cl

rxztt3cl1#

七年后。..我发现了这个解决方案,基于this主题。
我不确定这是否是一个好的解决方案,性能方面,但它看起来比公认的解决方案更干净。

db.collection.find({
  tags: {
    "$not": {
      "$elemMatch": {
        "$nin": [
          "tag1",
          "tag2",
          "tag4"
        ]
      }
    }
  }
})
byqmnocz

byqmnocz2#

您可以使用聚合框架来实现这一点。鉴于以下数据

> db.post.find()
{ "_id" : 1, "tags" : [ "tag1" ] }
{ "_id" : 2, "tags" : [ "tag1", "tag3" ] }
{ "_id" : 3, "tags" : [ "tag2", "tag4" ] }
{ "_id" : 4, "tags" : [ "tag1", "tag2", "tag3", "tag4" ] }

聚合查询

db.post.aggregate({
  $project: {
    _id: 1,
    tags: 1,
    killFlag: {
      $const: [true, false]
    }
  }
}, {
  $unwind: "$tags"
}, {
  $unwind: "$killFlag"
}, {
  $match: {
    $nor: [{
        tags: {
          $in: ['tag1', 'tag2', 'tag4']
        },
        killFlag: true
      }
    ]
  }
}, {
  $group: {
    _id: "$_id",
    tags: {
      $addToSet: "$tags"
    },
    killFlag: {
      $max: "$killFlag"
    }
  }
}, {
  $match: {
    killFlag: false
  }
}, {
  $project: {
    _id: 1,
    tags: 1
  }
})

会给予你

{
  "result": [{
      "_id": 3,
      "tags": [
          "tag4",
          "tag2"
      ]
    }, {
      "_id": 1,
      "tags": [
          "tag1"
      ]
    }
  ],
  "ok": 1
}
oprakyz7

oprakyz73#

我有一个类似的任务,什么是为我工作:

db.collection.find({ tags: { "$all":[ "tag1", "tag2", "tag4"] }})

也许对某些人来说,这将是一个有用的解决方案,建立在docs www.example中 www.example.com

相关问题