【问题标题】:How to create an array or embedded document from three existing fields in my collection in MongoDB如何从我在 MongoDB 中的集合中的三个现有字段创建数组或嵌入文档
【发布时间】:2020-04-06 10:45:54
【问题描述】:

首先,我是 MongoDB 新手,所以这个问题对你们中的一些人来说可能很容易回答。我正在尝试创建一个数组或嵌入文档,其中包含我的集合中的现有字段。换句话说,假设我有一个包含“borough”、“street”和“zipcode”字段的集合。我想创建一个名为“Location”的嵌入式文档,然后将这三个字段移至该文档。这可能吗?以下是我尝试实现这一目标的众多不同方法之一:

db.cooking.aggregate([{$set:{"borough":"$borough", "street":"$street", "zipcode":"$zipcode"}},{$out:"Location"}])

然后我将使用 db.Location.copyTo(cooking) 表达式将新创建的聚合集合“Location”中的数据添加到主集合“cooking”时间>。当然,我必须从 cooking 集合中删除现有的三个字段,因为我在嵌入文档 Location 中有相同的信息以避免重复数据。

【问题讨论】:

  • 最初我尝试使用这个表达式 db.cooking.updateMany({},{$push:{"Area":null, "Address":null, "Zip":null}}) 创建数组,然后我尝试 db.cooking.updateMany({},{$rename: {"borough": "Location.Area"}}) 更改字段的名称,但也没有运气。
  • 我发布了一个答案,它使用嵌入式文档覆盖/更新集合。希望有用。

标签: arrays mongodb aggregation-framework robo3t embedded-documents


【解决方案1】:

您可以使用以下方法之一创建包含现有字段的嵌入文档:

假设您有一个包含如下文档的集合:

{ _id: 1, fld1: 12, fld2: "red" },
{ _id: 2, fld1: 9, fld2: "blue" },
{ _id: 3, fld1: 34, fld2: "green" }

并且您想创建一个名为location 的嵌入文档,其中包含fld1fld2 字段;以下聚合将做到这一点:

db.test.aggregate( [
  { $project: { "location.fld1": "$fld1", "location.fld2": "$fld2" } },
  { $out: "test" }
] )

注意原来的集合test会被覆盖,会变成这样:

{ "_id" : 1, "location" : { "fld1" : 12, "fld2" : "red" } }
{ "_id" : 2, "location" : { "fld1" : 9, "fld2" : "blue" } }
{ "_id" : 3, "location" : { "fld1" : 34, "fld2" : "green" } }


第二种方法:

这要求您使用的是 MongoDB 版本 4.2。这个更新查询只是修改了同一个集合中的现有文档(结果和上面一样):

db.test.updateMany(
  { },
  [
      { $set: { "location.fld1": "$fld1", "location.fld2": "$fld2" } },
      { $unset: [ "fld1", "fld2" ] }
  ]
)

【讨论】:

  • 感谢您的回答,看起来合乎逻辑但我收到此错误消息:无法执行脚本。错误:更新操作文档必须包含原子操作符详情:DBCollection.prototype.updateMany@src/mongo/shell/crud_api.js:625:1
  • updateMany 仅适用于 MongoDB 4.2 或更高版本(第二种方法)。
  • 聚合创建了另一个集合,现在我想弄清楚如何将该集合与我的主集合合并。似乎 db.collection.copyTo(newCollection) 已被弃用,所以这是不可能的。我正在尝试找出一种使用 $push 的方法。最终,我希望在我的主集合中拥有嵌入式文档,并删除主集合中已存在于嵌入式文档中的字段。
  • 哦,顺便说一句,我有 Mondodb 4.2.1,但 updateMany 方法并没有如前所述工作。这似乎比必须合并集合和所有这些更好的方法......但无论出于何种原因它都不起作用。
  • 您是从哪个客户端运行查询的?我尝试使用 Mongo Shell。你呢,你用什么工具?
猜你喜欢
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 2021-06-15
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
相关资源
最近更新 更多