Mongoose数组和子数组更新

时间:2016-03-29 10:15:05

标签: node.js mongodb mongoose

我有模特: 其中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

有没有人指出这个问题?

1 个答案:

答案 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
        }
    }
)