【问题标题】:Mongo find and modify array in documents [duplicate]Mongo在文档中查找和修改数组[重复]
【发布时间】:2020-09-06 04:28:20
【问题描述】:

我有几个带有以下道具的文档:

{
  '_id':the_id
  'relationships': [{
      'rel_name': 'HAS_TAG'
      'rel_destination': 'TAG'
  },{
      'rel_name': 'HAS_CORE_TAG'
      'rel_destination': 'TAG'
  }]
}

一些文档有一个更大的relationships 列表,而这些关系总是有一个rel_name 和一个rel_destination。 我正在努力进行 mongodb 查询,以便它可以:

  1. 查找关系中至少包含一个rel_name = HAS_CORE_TAG 的所有文档
  2. 将所有rel_name = HAS_CORE_TAG 替换为HAS_NEW_TAG

在一个查询中可能吗?还是应该遍历所有文档和每个文档上的relationships 列表?

【问题讨论】:

    标签: arrays mongodb


    【解决方案1】:

    您可以使用过滤后的位置运算符$[<identifier>] 来发挥作用。

    假设当前集合如下所示:

    {
      "relationships" : [
        {
          "rel_name": "HAS_TAG",
          "rel_destination": "TAG"
        },
        {
          "rel_name": "HAS_CORE_TAG",
          "rel_destination": "TAG"
        },
        {
          "rel_name": "HAS_CORE_TAG",
          "rel_destination": "TAG1"
        },
        {
          "rel_name": "HAS_CORE_TAG",
          "rel_destination": "TAG2"
        }
      ]
    },
    {
      "relationships" : [
        {
          "rel_name": "HAS_TAG",
          "rel_destination": "TAG"
        }
      ]
    }
    

    以下查询会有所帮助:

    db.collection.update(
      {'relationships.rel_name': 'HAS_CORE_TAG'},
      {$set: {'relationships.$[elem].rel_name': 'HAS_NEW_TAG'}},
      {multi:true, arrayFilters: [
        {'elem.rel_name': 'HAS_CORE_TAG'}
      ]}
    )
    

    现在,集合将如下所示:

    {
      "relationships" : [
        {
          "rel_name": "HAS_TAG",
          "rel_destination": "TAG"
        },
        {
          "rel_name": "HAS_NEW_TAG",
          "rel_destination": "TAG"
        },
        {
          "rel_name": "HAS_NEW_TAG",
          "rel_destination": "TAG1"
        },
        {
          "rel_name": "HAS_NEW_TAG",
          "rel_destination": "TAG2"
        }
      ]
    },
    {
      "relationships" : [
        {
          "rel_name": "HAS_TAG",
          "rel_destination": "TAG"
        }
      ]
    }
    

    您可以在here阅读更多内容。

    【讨论】:

      【解决方案2】:

      您可以做的是,首先获取您在第一个场景中提到的至少具有“HAS_CORE_TAG”的所有文档。然后映射每个元素并应用条件

      {
          $match: {
              "relationships.rel_name": "HAS_CORE_TAG"
          }
      }, {
          $addFields: {
              relationships: {
                  $map: {
                      input: '$relationships',
                      as: "r",
                      in: {
                          "rel_name": {
                              $cond: [{
                                      $eq: ["$$r.rel_name", "HAS_CORE_TAG"]
                                  },
                                  "HAS_NEW_TAG", "$$r.rel_name"
                              ]
      
                          },
                          "rel_destination": "$$r.rel_destination"
                      }
                  }
              }
          }
      }
      

      工作Mongo playground

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-24
        • 1970-01-01
        • 1970-01-01
        • 2017-04-01
        • 2016-07-27
        • 1970-01-01
        相关资源
        最近更新 更多