我是mongodb的新手。我想在现有文档上更新或添加新的数组值。
我的意见是:
{
"_id" : "Tx8Yo3FJC7WpqNpGs",
"sharedId" : "LnkvSu8zdaahHjQmu",
"data" : [{
"ownerId" : "100",
"taskId" : 1000,
"taskName" : "trip"
},{
"ownerId" : "100",
"taskId" : 2000,
"taskName" : "meeting"
}]
}
预期输出为:
{
"_id" : "Tx8Yo3FJC7WpqNpGs",
"sharedId" : "LnkvSu8zdaahHjQmu",
"data" : [{
"ownerId" : "100",
"taskId" : 1000,
"taskName" : "trip"
},{
"ownerId" : "100",
"taskId" : 2000,
"taskName" : "meeting"
},{
"ownerId" : "100",
"taskId" : 3000,
"taskName" : "games"
}
]
}
我试过这个,但没有成功。
SharedTask.update({
sharedId: sharedToIds,
data: {
ownerId: userId,
taskId: taskId
},
}, {
$push: {
data: [{
'ownerId': userId,
'taskId': taskId,
'taskName': taskName
}]
}
}, {
upsert: true
});
答案 0 :(得分:0)
利用$addToSet
$addToSet
运算符向数组添加值,除非该值已经存在,在这种情况下$addToSet
对该数组不执行任何操作。
SharedTask.update({
sharedId: sharedToIds,
}, {
$addToSet: {
data: {
'ownerId': userId,
'taskId': taskId,
'taskName': taskName
}
},{
upsert: true
}
});
答案 1 :(得分:0)
您无法一次更新所有文档,因为您正在通过更新和添加来维护对象数组。你可以按照以下方式逐一完成。
var _ = require('underscore');
var updated = {
ownerId : "100",
taskId : 2000,
taskName : "meeting1" };
SharedTask.findOne({
sharedId: sharedToIds,
}, function(err, sharedTask){
if(!err){
var index = _.findIndex(sharedTask.data, { taskId: updated.taskId, ownerId:updated.ownerId });
if(~index){
sharedTask.data[index] = updated;
}else{
sharedTask.data.push(updated);
}
sharedTask.save(function(err){
if(!err){ console.log("Its okay"); }
});
}
});
您可以按上述Hiren S执行此操作。但是有一个问题,它不会更新现有的。