更新mongodb中的数组

时间:2017-10-03 08:06:05

标签: javascript arrays node.js mongodb mongoose

对于以下结构,我试图将选项下的第一个数组项更新为[“milk”,1]:

{    
  options:[["milk", 0],
           ["chocolate", 0],
           ["others", 0]],
  timestamp:"2017-09-26T14:42:49.359Z"
  title:"shopping list"
  username:"a"
}

这是我使用的猫鼬片段。

router.put('/',(req,res) => {
  let {_id, value, option} = req.body;   
  eventModel.findOneAndUpdate(    
    {_id:_id, options: [option, value]},
    { $set: {"options.$": [option, value + 1]}},
      function(err){
      if(err){
          res.status(400).json({ error: err });
      }
      console.log("event updated");
  });    
});

我总是得到“事件更新”没有错误,但项目没有得到更新,任何帮助表示赞赏。谢谢

1 个答案:

答案 0 :(得分:1)

为什么使用这种数组对来存储你的值? 任何具体原因。

否则你可以像这样存储数据,然后查询:

const ShoppingListSchema = new Schema({
  username: {type: String},
  title: {type: String},
  timestamp: {type: Date, default: Date.now()},
  options: [{
    product: {type: String},
    selected: {type: Number}
  }]
});
  // then
  eventModel.findOneAndUpdate(    
    {_id:_id, 'options.product': productName, 'options.selected': selected},
    {"options.$.value": value + 1},
      function(err){
      if(err){
          res.status(400).json({ error: err });
      }
      console.log("event updated");
  }); 

//也快,请注意。如果您希望列表中的设置项目为"包含"或不,那么......你实际上并不需要"价值"部分。 如果产品在数组中,则产品在购物清单中。

options: ["milk", "bread", "beer"] would work just as well

另外,我可以看到你正在做的事情"价值+ 1" 简单来说,有一个用于递增值的操作数:

$inc: {field: value}

使用替代选项进行快速更新:

db.getCollection('list').update({"options": ["milk", 0]}, {$set: {"options.$.1": 1} })

use $.1 to refer to the second element in your array, which is the number.