【问题标题】:update array subfield mongoose更新数组子字段猫鼬
【发布时间】:2017-02-22 10:26:21
【问题描述】:

我有一个 mongoose 架构,并且我设法执行 FindOneAndUpate 查询没有问题。但要这样做,我必须提供所有字段才能仅更新几个数组中的 1 个中的 1 个对象,这非常不方便。

我尝试使用 $set 但似乎无效。我正在发布代码并希望得到一些帮助。提前致谢。

var comandaSchema =  mongoose.Schema({

mesa: {type: Object},

fechaorden: {type: Date, default: Date.now},

orden: [{


    postres:  [{

        idapoyo:idapoyoSchema,

        postre:String,

        estadoitem: String,

        contorno:[]

    }],

    bebidas:  [{

        idapoyo:idapoyoSchema,

        bebida:String,

        estadoitem: String,

        contorno:[]

    }], 

    fondos:   [{

        idapoyo:idapoyoSchema,

        fondo:String,

        estadoitem: String,

        contorno:[]

    }],

    entradas: [{

        idapoyo:idapoyoSchema,

        entrada:String,

        estadoitem: String,

        contorno:[]

    }]


}],

estado_orden: {type: String},

estado_bebida: {type: String},

estado_pcuenta: {type: String},

estado_pago: {type: String}

});

  var Comanda = module.exports = mongoose.model('Comanda', comandaSchema);

还有我的更新功能:

app.put('/api/estadofondo/:_id', function(req, res){
var id = req.params._id;
var comanda = req.body;
Comanda.findOneAndUpdate(id, {"$set":  ["orden.fondos"] }, {}, function(err, comanda){
    if(err){
        throw err;
    }
    res.json(comanda);
});
});

我发送这个 json 来更新 "estadoitem": "ready"

{
"fondos": [
      {
        "contorno": [
          "Extra Tocineta",
          "Champiñon"
        ],
        "estadoitem": "ready",
        "fondo": "Pizza Americana"
      }]
}

最初是“estadoitem”:“未准备好”,但就像我说的那样,什么都没有发生,所以如果我能得到一些帮助,我将不胜感激。再次感谢。

编辑:我还想知道是否可以使用类似 $set 的内容更新“estadoitem”字段:[orden.fondos.estadoitem]。我对架构中的每个项目都有一个 ID,因此我可以通过某种方式访问​​它以获取确切的项目

最终更新--------

我所需要的接受的答案是一种动态设置 $set 的方法

按照Passing parameters to the array updater method {$set: {"parameters": data}} 来实现这一目标

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:
    app.put('/api/estadofondo/:_id', function(req, res){
    var id = req.params._id;
    var comanda = req.body;
    Comanda.findOneAndUpdate(id, {"$set":  {orden.0.fondos: 'object with values'} },{safe: true, upsert: true}, function(err, comanda){
        if(err){
            throw err;
        }
        res.json(comanda);
    });
    });
    

    https://docs.mongodb.com/manual/core/document/#dot-notation

    【讨论】:

    • 您好,感谢您的回复,将 {"$set": {orden.0.fondos: 'object with values'} } 改为 {"$set":orden.0.fondos : ' "estadoitem": "ready" '} 我遇到了 sintax 错误,我有点不明白 orden.0.fondos 中的 0 是什么意思,请详细说明一下?再次感谢,编辑:在选项括号中是“安全”还是“保存”
    • ok 得到了{"$set": {"orden.0.fondos": [comanda]}} 的更新,我正在做我需要的事情,但我有 3 组数据保存在“fondos”中,它正在删除另外 2 组,我正在发送这个 json:`“contorno” : [ "Extra Tocineta", "Champiñon" ], "estadoitem": "listo", "fondo": "Pizza Americana" ` 我只想将 "estadoitem" 发送到特定元素
    • 得到了{"$set": {"orden.0.fondos.1.estadoitem": estadoitem}} 的更新,我能够更改非常具体的字段,但正在使我的字段成为一个对象,我需要保持一个简单的字符串。我做错了什么?我发送这个 json { "estadoitem": "listo" }
    • 0 1 只是数组的索引
    • estadoitem: String, 是您架构中的字符串,请检查
    【解决方案2】:

    好的,看来我很难传达我需要做的事情,到目前为止,这是我在@p0k8 非常感谢的帮助下所做的更新,有了这个新功能,我可以随意更改我的模型中数组 [fondos] 中的字段“estadoitem”但我需要能够自动选择索引

    app.put('/api/estadofondo/:_id', function(req, res){
    var id = req.params._id;
    var estadoitem = req.body;
    
    //var directo = orden.0.fondos.$.estadoitem;
    //var directo = "orden.0.fondos.0.estadoitem";
    
    Comanda.findOneAndUpdate(id,{$set: {"orden.0.fondos.1.estadoitem": estadoitem}}, {upsert: true}, function(err, comanda){
        if(err){
            throw err;
        }
        res.json(estadoitem);
    });
    });
    

    我知道我必须以某种方式将索引值传递给:

     {$set: {"orden.0.fondos.1.estadoitem": estadoitem}}
    

    “0”在那里没问题,因为订单总是为 0,但“1”在任何时候都可能是 N,所以我需要将该参数传递给我的函数...这是我卡住的地方,一如既往地感谢前进。

    更新:*********************************************

    新功能是:

    app.put('/api/estadofondo/:_id', function(req, res){
    var id = req.params._id;
    var estadoitem = req.body;
    
    var $ = estadoitem.index;
    
    var estado = estadoitem.estadoitem;
    
    console.log($, estado);
    
    Comanda.findOneAndUpdate(id,{$set: {"orden.0.fondos.0.estadoitem": estado}}, {upsert: true}, function(err, comanda){
    //Comanda.findOneAndUpdate(id,{"$set": {estadoitem: estado}}, {safe: true, upsert: true}, function(err, comanda){
        if(err){
            throw err;
        }
        res.json(estadoitem);
    });
    });
    

    它与我的 json 完美配合

    {
    
    
    
            "estadoitem": "listo",
            "index": 1
    
    
    
    }
    

    如果我只知道在哪里放置“$”以将其用作我的索引选择器... =/

    如果我用 {$set: {"orden.0.fondos.$.estadoitem": estado} 替换 {$set: {"orden.0.fondos.0.estadoitem": estado 中的第二个“0” } 它只是崩溃

    新更新************************************************ ************

    新功能是

    app.put('/api/estadofondo/:_id', function(req, res){
    var id = req.params._id;
    var estadoitem = req.body;
    
    var index = estadoitem.index;
    
    var estado = estadoitem.estadoitem;
    
    Comanda.findOneAndUpdate({_id:id, "orden.0.fondos.estadoitem": "pendiente"}, {$set: {"orden.0.fondos.$.estadoitem": estado}}, {upsert: true}, function(err, comanda){
        if(err){
            throw err;
        }
        res.json(estadoitem);
    });
    });
    

    每次我发送 JSON 时它都会工作,它会更新数组,但我仍然不能更新我告诉的那个

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      • 2018-09-13
      • 2020-08-05
      • 2015-06-03
      • 2015-04-11
      相关资源
      最近更新 更多