gpt4 book ai didi

arrays - 更新 MongoDB 中的子文档数组

转载 作者:可可西里 更新时间:2023-11-01 10:21:24 25 4
gpt4 key购买 nike

我有一组学生,他们有一个名字和一组电子邮件地址。学生文件看起来像这样:

{
"_id": {"$oid": "56d06bb6d9f75035956fa7ba"},
"name": "John Doe",
"emails": [
{
"label": "private",
"value": "private@johndoe.com"
},
{
"label": "work",
"value": "work@johndoe.com"
}
]
}

电子邮件子文档中的标签设置为每个文档都是唯一的,因此不能有两个条目具有相同的标签。

我的问题是,在更新学生文档时,我想实现以下目标:

  • 添加带有新标签的电子邮件应该只向数组添加带有给定标签和值的新子文档
  • 如果添加一个标签已经存在的邮件,existing的值应该设置为update的数据

例如,使用以下数据更新时:

{
"_id": {"$oid": "56d06bb6d9f75035956fa7ba"},
"emails": [
{
"label": "private",
"value": "me@johndoe.com"
},
{
"label": "school",
"value": "school@johndoe.com"
}
]
}

我希望电子邮件数组的结果是:

"emails": [
{
"label": "private",
"value": "me@johndoe.com"
},
{
"label": "work",
"value": "work@johndoe.com"
},
{
"label": "school",
"value": "school@johndoe.com"
}
]

我如何在 MongoDB 中实现这一点(可选地使用 mongoose)?这是完全可能的还是我必须自己在应用程序代码中检查数组?

最佳答案

您可以尝试此更新,但仅对小型数据集有效:

mongo 外壳:

var data = {
"_id": ObjectId("56d06bb6d9f75035956fa7ba"),
"emails": [
{
"label": "private",
"value": "me@johndoe.com"
},
{
"label": "school",
"value": "school@johndoe.com"
}
]
};

data.emails.forEach(function(email) {
var emails = db.students.findOne({_id: data._id}).emails,
query = { "_id": data._id },
update = {};

emails.forEach(function(e) {
if (e.label === email.label) {
query["emails.label"] = email.label;
update["$set"] = { "emails.$.value": email.value };
} else {
update["$addToSet"] = { "emails": email };
}
db.students.update(query, update)
});
});

关于arrays - 更新 MongoDB 中的子文档数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39125838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com