【问题标题】:Update Array attribute using Mongoose使用 Mongoose 更新数组属性
【发布时间】:2018-01-24 14:16:24
【问题描述】:

我正在开发一个 MEAN 堆栈应用程序,在该应用程序中我使用以下模式定义了一个模型:

var mappingSchema = new mongoose.Schema({
    MainName: String,
    Addr: String,
    Mapping1: [Schema1],
    Mappings2: [Schema2]
},
{collection : 'Mappings'} 
);

我在 UI 上显示所有这些数据,Mapping1Mapping2 显示在两个表中,我可以在其中编辑值。我想要做的是,一旦我更新了表中的值,我应该在数据库中更新它们。我写了put() api,在那里我以对象的形式获取这两个更新的映射,但无法在数据库中更新它。我尝试使用findAndModify() & findOneAndUpdate() 但失败了。 以下是 Schema1 和 Schema2:

const Schema1 = new mongoose.Schema({
    Name: String,
    Variable: String
});

const Schema2 = new mongoose.Schema({
    SName: String,
    Provider: String
});

还有我的put api:

.put(function(req, res){

  var query = {MainName: req.params.mainname};

        var mapp = {Mapping1: req.params.mapping1, Mapping2: req.params.mapping2};

        Mappings.findOneAndUpdate(
            query, 
            {$set:mapp}, 
            {}, 
            function(err, object) {
                if (err){
                    console.warn(err.message);  // returns error if no matching object found
                }else{
                    console.log(object);
                }
            });                
    });

请建议更新这两个数组的最佳方式。

更新: 我试过这个

var mapp = {'Mapping2': req.params.mapping2};

        Mappings.update( query , 
                           mapp , 
                        { },
                        function (err, object) {
                            if (err || !object) {
                                console.log(err);
                                res.json({
                                    status: 400,
                                    message: "Unable to update" + err

                                });
                            } else {
                                return res.json(object);
                            }
                        });

我得到的是

我的大小为 3 的数组在 Mapping2 数组中保存为字符串。

请帮忙。卡得很厉害。 :(

【问题讨论】:

    标签: javascript angularjs node.js mongodb mean-stack


    【解决方案1】:

    来自Mongoose's documentation 我相信没有必要使用$set。只需传递一个具有要更新的属性的对象:

    Mappings.findOneAndUpdate(
          query, 
          mapp,  // Object containing the keys to update
          function(err, object) {...}
     );
    

    【讨论】:

    • 它在控制台上给出以下内容:'Cast to embedded failed for value "\'[object Object],[object Object],[object Object]\'" at path "Mappings1" PUT /api/映射/测试%20Model/%5Bobject%20Object%5D,%5Bobject%20Object%5D,%5Bobject%20Object%5D/%5Bobject%20Object%5D,%5Bobject%20Object%5D,%5Bobject%20Object%5D,%5Bobject %20Object%5D 200 41.067 毫秒 - 159'
    猜你喜欢
    • 1970-01-01
    • 2017-04-16
    • 2012-09-04
    • 2015-09-19
    • 1970-01-01
    • 2022-09-23
    • 2017-05-07
    • 2016-05-03
    • 2020-09-13
    相关资源
    最近更新 更多