MongoDB:使用同一文档中对象的属性重新形成文档

发布于 2025-02-07 04:09:06 字数 1117 浏览 2 评论 0原文

我有一个集合如下,

{
  "name": "Sherlock Holmes",
  "address": {
     "house":"221b",
     "street":"Baker St",
     "city":"London",
  }
},
{
  "name": "James Bond",
  "address": {
     "door_number":"30",
     "address1":"Wellington Square",
     "city":"London",
  }
}

我想在地址中循环浏览每个属性,并在主文档中创建一个单独的字段。那是在执行命令后,集合应该如下如下,

{
  "name": "Sherlock Holmes",
  "house":"221b",
  "street":"Baker St",
  "city":"London",
},
{
  "name": "James Bond",
  "door_number":"30",
  "address1":"Wellington Square",
  "city":"London",
}

address>地址对象在不同的​​文档中有所不同。 使用命令行实现它的最佳方法是什么? 我尝试过以下尝试

db.employees.find().forEach(function(obj) {
for (var key in obj.address) {
      if (obj.address.hasOwnProperty(key)) {
            db.employees.update({ '_id': obj._id }, {
                '$set': { key: obj.address[key] }
            });
      }
    }
});

,但它仅添加了一个带有名称的字段。

I have a collection as follows

{
  "name": "Sherlock Holmes",
  "address": {
     "house":"221b",
     "street":"Baker St",
     "city":"London",
  }
},
{
  "name": "James Bond",
  "address": {
     "door_number":"30",
     "address1":"Wellington Square",
     "city":"London",
  }
}

I would like to loop through each property in address and create a separate fields in main document. That is after executing the command the collection should look like as follows

{
  "name": "Sherlock Holmes",
  "house":"221b",
  "street":"Baker St",
  "city":"London",
},
{
  "name": "James Bond",
  "door_number":"30",
  "address1":"Wellington Square",
  "city":"London",
}

The key of address object is different for different documents.
What is the best way to achieve it using command line ?
I have tried like below

db.employees.find().forEach(function(obj) {
for (var key in obj.address) {
      if (obj.address.hasOwnProperty(key)) {
            db.employees.update({ '_id': obj._id }, {
                '$set': { key: obj.address[key] }
            });
      }
    }
});

But it adds a field with name key only.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

表情可笑 2025-02-14 04:09:06

您可以使用$ MergeObject构建您的预期输出。然后使用$替换来解决结果。

db.collection.update({},
[
  {
    "$addFields": {
      "merged": {
        "$mergeObjects": [
          {
            // fields that you want to keep in outer
            _id: "$_id",
            name: "$name"
          },
          "$address"
        ]
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": "$merged"
    }
  }
],
{
  multi: true
})

这是 mongo Playground 供您参考。

You can use $mergeObjects to construct your expected output. Then use $replaceRoot to wrangle the result.

db.collection.update({},
[
  {
    "$addFields": {
      "merged": {
        "$mergeObjects": [
          {
            // fields that you want to keep in outer
            _id: "$_id",
            name: "$name"
          },
          "$address"
        ]
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": "$merged"
    }
  }
],
{
  multi: true
})

Here is the Mongo Playground for your reference.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文