2017-02-21 12 views
0

У меня есть схема mongoose, и мне удается выполнить запрос FindOneAndUpate без проблем. Но для этого я должен предоставить все поля, чтобы обновить только один объект в 1 из нескольких массивов, что очень неудобно.Обновление массива subfield mongoose

Я попытался использовать $ 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": "готов"

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

, который первоначально "estadoitem": «не готово ", но, как я сказал, ничего не происходит, поэтому я был бы признателен, если бы я мог получить некоторую помощь. Опять же, спасибо.

EDIT: Мне также интересно, могу ли я обновить только поле «estadoitem» с чем-то вроде $ set: [orden.fondos.estadoitem]. У меня есть идентификатор для каждого отдельного элемента в схеме, так что я мог каким-то образом получить доступ, что, чтобы добраться до точного пункта

FINAL UPDATE --------

acceted ответ работает все, что мне было нужно способ динамично установить $ установить

следовать этому Passing parameters to the array updater method {$set: {"parameters": data}}, чтобы добиться того, что

ответ

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

+0

привет спасибо за ответ, с {"$ set": {orden.0.fondos: 'объект со значениями}}, измененный на {"$ set" : orden.0.fondos: '"estadoitem": "ready"'} im получение sintax error, и я вроде не под стоять то, что 0 для в orden.0.fondos, ум разработать немного больше? Еще раз спасибо, отредактируйте: в скобках параметров это «безопасно» или «сохранить» –

+0

ok получил обновление с '{" $ set ": {" orden.0.fondos ": [comanda]}}' im, делая то, что я нужно, но у меня есть 3 набора данных, сохраненных в «фондах», и он удаляет другие 2, im отправляет этот json: '' contorno ': [ «Extra Tocineta», «Champiñon» ], «estadoitem»: «listo», «fondo»: «Pizza Americana», и я бы хотел только отправить «estadoitem» определенному элементу –

+0

получил обновление с '{" $ set ": {" orden.0.fondos.1. estadoitem ": estadoitem}}' im, способный изменить очень специфическое поле, но делает мое поле объектом, и мне нужно оставаться простой строкой .. что я делаю неправильно? im отправляет этот json { "estadoitem": "listo" } –

0

ИТАК, кажется, Мне очень сложно общаться, что мне нужно сделать, пока это обновление о том, что я сделал с ОЧЕНЬ высоко оцененной помощью от @ p0k8, с этой новой функцией я могу по желанию изменить поле «estadoitem» от Массив [Fondos] в моей модели, но мне нужно, чтобы быть в состоянии выбрать индекс автоматически

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 



} 

Если бы я только знать, куда поместить «$», чтобы использовать его в качестве моего выбора индекса ... =/

если сделаю {$ комплект: {"orden.0. fondos. $. estadoitem ": estado}, заменяя второй« 0 »в {$ set: {" orden.0.fondos.0.estadoitem ": estado} он просто падает

NEW UPDATE ************************************ *********************

новая функция

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, он будет обновлять массивы в безопасности, но я все еще не могу обновить сообщение im im

 Смежные вопросы

  • Нет связанных вопросов^_^