更新数组子字段mongoose

时间:2017-02-21 06:08:43

标签: javascript node.js mongodb mongoose

我有一个mongoose架构,我设法执行FindOneAndUpate查询没有问题。但要这样做,我必须提供所有字段,以便更新几个数组中的一个中的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:[orden.fondos.estadoitem]更新字段“estadoitem”。我有一个模式中的每个项目的ID,所以我可以以某种方式访问​​它以获得确切的项目

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

加入的答案可以解决所有我需要的方法来设置$ set

按照此Passing parameters to the array updater method {$set: {"parameters": data}}来实现

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

好的,似乎我很难沟通我需要做的事情,到目前为止这是我对@ 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,所以我需要将该参数传递给我的函数...这就是我卡住的地方,一如既往地感谢提前。

UPDATE:*********

新功能是:

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”中的第二个“0”:estado它只是崩溃

最新消息********************************************* ************

新功能

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时它确实有效,它会在secuence中更新数组但是我仍然可以更新一个即时消息