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_id
和employment_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_type
和yearly_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 将数据移动到集合之间的文档中的主要内容,如果未能解决你的问题,请参考以下文章