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

标签 node.js mongoose updating

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

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

"contacts" : [ 
    {
        "_id" : ObjectId("58be7c236dcb5f2feff91ac2"),
         "name": { type: String, required: true },
        "company" : ObjectId("58be7c236dcb5f2feff91ac0"),
        "email" : "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="51223a2811363c30383d7f323e3c" rel="noreferrer noopener nofollow">[email protected]</a>",
        "chatId" : "",
        "phone" : "123456789",
        "name" : "John Smith"
    },
    {
        "_id" : ObjectId("58be7f3a6dcb5f2feff91ad3"),
        "company" : ObjectId("58be7f3a6dcb5f2feff91ad1"),
        "email" : "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f496918095b49399959d98da979b99" rel="noreferrer noopener nofollow">[email protected]</a>",
        "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/

相关文章:

mysql - 关联关联 : include entity in JSON response

node.js - 如何在发出请求时等待客户端的响应?

node.js - MongoDB $ lookup vs Mongoose 填充

python - 复制嵌套列表,然后仅更新新列表中的值

arrays - 如何在 Swift 4.0 中使用 WritableKeyPath 更新数组

javascript - 修改公共(public) npm 包中的一些功能

javascript - Node JS + Express - 提供静态文件和数据

node.js - 如何 stub Mongoose 模型保存*和*它的保存 Hook

node.js - 根据 mongoose、mongoDB 中的条件填充

css - 乔姆拉/FTP : Files updated via ftp won't update in browser