【问题标题】:MongoDB move data into documents between collectionsMongoDB 将数据移动到集合之间的文档中
【发布时间】:2022-01-01 20:54:15
【问题描述】:

我需要在集合之间移动数据,因为它们之前是使用关系模型设计的,并且我们遇到了一些查找性能问题。请注意,显示的数据只是一个示例,我需要为大量数据执行此操作。 数据结构如下:

// Collection person
{
   _id: <object_id>
   ...other data
}
// Collection employments
{
    _id: <object_id>
    person_id: <person_id>,
    ... other data,
}

现在我需要根据person_idemployment_id 将所有数据从employments 集合移动到person 集合。而且我不会删除employments 集合,因为由于某些用例,我还需要将一些元数据从person 集合移动到employment 集合。

编辑:

一个person 可以有多个employments。所以我需要用实际的employments 数据替换person 中的所有ids。此外,就业有person_id 需要替换(可以创建一个新属性,比如person 而不是替换person_id)由person 的一些元数据(例如姓名、电子邮件..)。

$merge 似乎很有希望。将需要尝试一下。让我感到困惑。

想要的结果示例:

两个集合中的文档如下所示:

人物集合

{
  "_id": "619cf3045ce7329d6a8c059c",
  "name": "John Doe",
  "email": "johndoe@mail.com",
  "contact": 1234567890
}

就业征集

// Two documents related to person above
  // Document one
  {
    "_id": "619cf89913380c621ea8d4ec",
    "person_id": "619cf3045ce7329d6a8c059c",
    "employment_type": "Owner",
    "yearly_income": 10000000
  }
  // Document two
  {
    "_id": "619cf912374db5aec2ceb6de",
    "person_id": "619cf3045ce7329d6a8c059c",
    "employment_type": "Salary",
    "yearly_income": 12340000
  }

人员集合的预期结果将更新为

{
  "_id": "619cf3045ce7329d6a8c059c",
  "name": "John Doe",
  "email": "johndoe@mail.com",
  "contact": 1234567890,
  "employments": [
    {
    "_id": "619cf89913380c621ea8d4ec",
    "person_id": "619cf3045ce7329d6a8c059c",
    "employment_type": "Owner",
    "yearly_income": 10000000
    },
    {
      "_id": "619cf912374db5aec2ceb6de",
      "person_id": "619cf3045ce7329d6a8c059c",
      "employment_type": "Salary",
      "yearly_income": 12340000
    }
  ]
}

就业收集的预期结果将更新为

注意:更新集合时不需要employment_typeyearly_income(可以删除)

  // Document one
  {
    "_id": "619cf89913380c621ea8d4ec",
    "person_id": "619cf3045ce7329d6a8c059c",
    "person": {
      "_id": "619cf3045ce7329d6a8c059c",
      "name": "John Doe",
      "email": "johndoe@mail.com",
      "contact": 1234567890
    }
  }
  // Document two
  {
    "_id": "619cf912374db5aec2ceb6de",
    "person_id": "619cf3045ce7329d6a8c059c",
    "person": {
      "_id": "619cf3045ce7329d6a8c059c",
      "name": "John Doe",
      "email": "johndoe@mail.com",
      "contact": 1234567890
    }
  }

任何接近此的解决方案都是非常可接受的。

【问题讨论】:

  • 看看$merge 请提供更多细节。 employments 是一个数组,但 person_id 是一个标量值,因此您需要进行一些转换,例如$group$unwind
  • 我添加了一个编辑@wernfried-domscheit。请检查一下。
  • 请提供更多的文件细节。我们不需要看到所有这些,只需2-3个作为参考。请提供所需的结果。
  • 文档与编辑展示几乎相同。我还包括了预期的结果。谢谢!

标签: node.js mongodb mongodb-query aggregation-framework aggregation


【解决方案1】:

试试这个:

db.person.aggregate([
   {
      $lookup: {
         from: "employment",
         localField: "_id",
         foreignField: "person_id",
         as: "employments"
      }
   },
   { $merge: { into: "person" } }
])

如果您想修改集合employment,请像这样使用它:

db.person.aggregate([
   {
      $lookup: {
         from: "employment",
         localField: "_id",
         foreignField: "person_id",
         pipeline: [{ $unset: ["employment_type", "yearly_income"] }],
         as: "employments"
      }
   },
   { $merge: { into: "person" } }
])

【讨论】:

    猜你喜欢
    • 2011-07-19
    • 2020-01-21
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多