MongoDB 将数据移动到集合之间的文档中

Posted

技术标签:

【中文标题】MongoDB 将数据移动到集合之间的文档中【英文标题】:MongoDB move data into documents between collections 【发布时间】: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个作为参考。请提供所需的结果。 文档与编辑展示几乎相同。我还包括了预期的结果。谢谢! 【参考方案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"  
])

【讨论】:

以上是关于MongoDB 将数据移动到集合之间的文档中的主要内容,如果未能解决你的问题,请参考以下文章

mongoDB 学习六

使用 Mongoose 将文档移动到另一个集合

将来自 2 个 mongoDB 集合的数据合并到 1 个文档中

MongoDB中要掌握的概念

在 Mongo 的集合之间移动文档(通过 Mongoid)

mongodb怎么插入多个文档