【问题标题】:How to check if an array field is a part of another array in MongoDB?如何检查一个数组字段是否是 MongoDB 中另一个数组的一部分?
【发布时间】:2013-03-16 03:57:44
【问题描述】:

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,因为['tag1', 'tag2', 'tag4']中不存在tag3

也就是说,选择标签数组中的所有元素都可以在另一个条件数组中找到的帖子

【问题讨论】:

  • “另一个数组的一部分”是什么意思,标签应该包含您要查找的所有内容还是仅包含您要查找的部分内容?
  • {post1.tags = ['tag1']} 或 {post2.tags = ['tag1', 'tag3']} 是数组 ['tag1','tag3'] 的一部分.
  • 如果你能保证你能做的订单:db.col.find({tags:[tag1,tag2]}) 但它需要一个好的订单
  • 好的,我看到你的编辑了,好像:db.col.find({tags: {$in:[tag1,tag2]}}) 应该可以工作
  • db.col.find({tags: {$in:[tag1,tag2]}}) 将搜索标签包含“tag1”或“tag2”的任何帖子。我可能会收到一些带有标签["tag1","tag3"]["tag2","tag4"] 的帖子,但它们不是我要查找的帖子。在这种情况下,我只想要带有标签 ["tag1"]、["tag2"] 或 ["tag1","tag2"] 的帖子

标签: mongodb


【解决方案1】:

您可以使用聚合框架来执行此操作。给定以下数据

> 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
}

【讨论】:

    【解决方案2】:

    7 年后... 我找到了这个解决方案,基于this 主题。

    我不确定这是否是一个好的解决方案,就性能而言,但它看起来比公认的解决方案更干净。

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

    【讨论】:

      【解决方案3】:

      我有一个类似的任务,什么对我有用:

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

      也许这对某人会有所帮助 解决方案建立在文档https://docs.mongodb.com/manual/tutorial/query-arrays/#specify-multiple-criteria-for-array-elements

      【讨论】:

        猜你喜欢
        • 2011-07-19
        • 1970-01-01
        • 1970-01-01
        • 2017-05-30
        • 2010-09-24
        • 2021-01-20
        • 2016-12-13
        • 1970-01-01
        相关资源
        最近更新 更多