gpt4 book ai didi

node.js - 使用 Mongoose 和 Node 更新多个子文档

转载 作者:太空宇宙 更新时间:2023-11-03 21:54:58 25 4
gpt4 key购买 nike

我有一个模型,其中包含一组子文档。这是一家公司:

{
"_id" : ObjectId(":58be7c236dcb5f2feff91ac0"),
"name" : "sky srl",

"contacts" : [
{
"_id" : ObjectId("58be7c236dcb5f2feff91ac2"),
"name": { type: String, required: true },
"company" : ObjectId("58be7c236dcb5f2feff91ac0"),
"email" : "sky@gmail.com",
"chatId" : "",
"phone" : "123456789",
"name" : "John Smith"
},
{
"_id" : ObjectId("58be7f3a6dcb5f2feff91ad3"),
"company" : ObjectId("58be7f3a6dcb5f2feff91ad1"),
"email" : "beta@gmail.com",
"chatId" : "",
"phone" : "987654321",
"name" : "Bill Gaset"
}
],
"__v" : 1
}

我有几家公司,我想更新所有公司中所有联系人的 chatId 字段,该字段与我正在搜索的电话相匹配。

我的架构定义(简化,用于关注问题):

var contactSchema = new Schema({
[...]
phone: { type: String, required: true },
email: { type: String },
chatId: { type: String },
company: Schema.Types.ObjectId,
});

var companySchema = new Schema({

name: { type: String, required: true },
type: { type: String, default: "company" },
contacts: [contactSchema]
});

我试过了

var conditions = { "contacts.phone": req.body.phone };
var partialUpdate = req.body; //it contains 'req.body.phone' and 'req.body.chatId' attributes
Company.find(conditions).then(
function (results) {
results.map( function(companyFound) {
companyFound.contacts.forEach(function (contactContainer){

if (contactContainer.phone == partialUpdate.phone) {
contactContainer.chatId = partialUpdate.chatId;

Company.save();
companyFound.save();
contactContainer.save();
results.save();
}

//not sure of what to save, so i save everything
companyFound.save();
contactContainer.save();
results.save();
});
});
});

接着这个 answer ;但它不起作用。它没有保存任何东西,我做错了什么?

最佳答案

我以前从未这样做过,但值得一试。

也许您需要使用$elemMatch .

// find the companies that have contacts having the phone number
Company.find().where('contacts', { $elemMatch: { phone: req.body.phone }}).exec(function (err, companies) {
if (err) {
console.log(err);
return;
}
// see if you can at least get the query to work
console.log(companies);
async.eachSeries(companies, function updateCompany(company, done) {
// find and update the contacts having the phone number
company.contacts.forEach(function (contact, i, arr) {
if (contact.phone == req.body.phone) {
arr[i].chatId = req.body.chatId;
}
});
company.save(done);
}, function allDone (err) {
console.log(err);
});
});

注意,我正在使用 async.js对多个项目执行异步操作。

老实说,我只会将 contacts 制作为 Contact references 的数组。 -- 更容易查询和更新。

关于node.js - 使用 Mongoose 和 Node 更新多个子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43475368/

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