我有一个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}}来实现
答案 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);
});
});
答案 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中更新数组但是我仍然可以更新一个即时消息