对于以下结构,我试图将选项下的第一个数组项更新为[“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");
});
});
我总是得到“事件更新”没有错误,但项目没有得到更新,任何帮助表示赞赏。谢谢
答案 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.