我有模特: 其中stats.d是当前日期,而t和u是一些统计数据。
name: string,
stats: [{
d: {type: date, default: moment().format('MM/DD/YYYY')},
t: number,
u: number,
}],
total: number
我要做的是更新,检查日期是否为今天如果今天增加t,如果今天日期不存在,则创建或添加具有当前日期和开始t点的stats数组的条目。所以我按日期会有统计数据。这是我尝试过的。
model.findOneAndUpdate({_id:req.params._id}, {$set:{"stats.d": date}, $inc: {total: 1, "stats.t": 1}}, {upsert:true}, function(err, data){
//success
});
但它不起作用。我收到以下错误:
can't append to array using string field name: t","code":13048,"ok":0
有没有人指出这个问题?
答案 0 :(得分:1)
我认为你不能在一个update
查询中执行此操作。
但您可以使用javascript
:
model.findOne(
{
_id: ObjectId("req.params._id")
},
function(err, data){
var isDateFound = false;
for (var i = 0; i < data.stats.length; i++) {
if (data.stats[i].d === date) {
isDateFound = true;
data.stats[i].t++;
break;
}
}
if (!isDateFound) {
data.stats.push({
d: date,
t: 1,
u: 0
})
}
data.total++;
model.save(data) // or data.save() should work as well
});
如果没有upsert
的要求,可以增加匹配的数组元素:
db.test.update(
{
_id: ObjectId("req.params._id"),
'stats.d': date
},
{
$inc: {
'stats.$.t': 1,
'total': 1
}
}
)