2015-11-12 3 views
0

У меня возникли проблемы, обертывающие мою голову вокруг обновления нескольких значений в моем mongoDB с использованием mongooseJS и ExpressJS.экспресс-запрос/mongoose update

Предположим, что я передаю массив из 2 или более объектов из моего интерфейса, чтобы «выразить маршрутизацию», и там я получаю параметры req.body для его получения. Мой req.body выглядит следующим образом:

[articles: 
    { article: { 
     _id: '564209c66c23d5d20c37bd84', 
     quantity: 25, 
    }, 
    { article: { 
     _id: '564209c66c23d5d20c37bd83', 
     quantity: 51, 
    }, 
}] 

Мне тогда нужно петлю? чтобы найти конкретную статью в db для обновления, и когда эта статья будет найдена, я хочу обновить значение «количество» от внешнего интерфейса до правильной статьи в db.

var id = []; 
var body = {}; 

for (var i = req.body.length - 1; i >= 0; i--) { 
    id.push(req.body[i].article._id); 
    body[i] = req.body[i].article.quantity; 
}; 

Articles.update( 
    { _id: {$in: id} }, 
    { $set: {quantity: body[0].article.quantity} }, 
    {multi: true}, 
    function(err, response){ 
    if(err) 
     console.log(err); 

    console.log(response); 
}); 

Проблема с этим кодом является то, что я ставлю в первом значении величины для всех статей, и я хочу, чтобы это было правильной во внешнем интерфейсе. Мне кажется, что я на правильном пути, но я довольно новичок в mongoDB и выражаю это, если есть лучшее решение или даже решение, дайте мне знать.

ответ

0

Grahlie,

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

Если статья документы структурированы как таковой:

{ 
    _id: ObjectId("564209c66c23d5d20c37bd84"), 
    quantity: 25 
} 
{ 
    _id: ObjectId("564209c66c23d5d20c37bd83"), 
    quantity: 51 
} 

Если вы хотите обновить количество уникального документа, основанного на это _id то вы могли так с этим запросом.

db.articles.update(
    {"_id": "564209c66c23d5d20c37bd84"}, 
    {$set : { "quantity" : 25}} 
) 

Если вы хотите обновить несколько документов, с тем же количеством можно использовать $in, но это не то, что вы хотите сделать. Вы хотите пройти через массив req.body и обновить количество каждого article.

Так что ваш код будет как таковой:

var articles = req.body; 


var updateArticle = function(article) { 

    Articles.update(
     {_id:article._id}, 
     {$set:{ quantity: article.quantity}}, 
     function(err, article){ 
      ... 
    ); 

} 


for(var i = 0, n = articles.length; i < n; i++){ 
    updateArticle(articles.[i].article); 
} 
+0

Спасибо это то, что я искал! Но с меньшими проблемами с этим я получаю эту ошибку от узла: throw new Error ('can not set header после их отправки'); Im, используя функцию res.json(), чтобы отправить ответ, и я понимаю, что это проблема правильно? Есть ли способ собрать все ответы и отправить или как мне это сделать? – grahlie

+0

Да. Это потому, что вы дважды вызываете res.json(). – inspired

+0

Вы можете использовать ['async'] (https://github.com/caolan/async#asyncjs), чтобы узнать, когда все обновления будут выполнены, а затем отправить ответ res.json(). – inspired