如何使用原子查询更新mongoose中另一个子文档中的子文档?

时间:2014-06-03 06:53:38

标签: node.js mongodb mongoose

我的Mongoose架构如下所示:

var MousePos = Schema({
    x: { type: Number},
    y: { type: Number},
    clickCount: {type: Number, default:0}
});

var MouseTrackInfo = Schema({
    pos:{ type: [MousePos], default:[]},
    element: {type: String, index:true},
    clickCount:{ type: Number, default: 0 },
    timeSpent: { type: Number, default: 0 }
});

var MouseTrackSchema = Schema({
    pageUrl: { type: String},
    applicationId: { type: String, index: true },
    mouseTrackLog: { type: [MouseTrackInfo], default:[]},
    urlId: {type: String, index: true}
});

现在我要做的是在指定元素,x和y值时更新pos子文档中的clickCount。

我尝试了很多方法,但似乎没有用。此外,我也不能在我的查询中使用两个$运算符。欢迎提出建议。我想尽可能使这个查询成为原子。

1 个答案:

答案 0 :(得分:0)

我无法找到可靠的方法,所以我将模式更改为以下内容:

var MouseTrackInfo = Schema({
    element: {type: String, index:true},
    clickCount:{ type: Number, default: 0 },
    timeSpent: { type: Number, default: 0 },
    x: { type: Number, default:0},
    y: { type: Number, default: 0},
    identifier: {type: String}
});

var MouseTrackSchema = Schema({
    pageUrl: { type: String},
    applicationId: { type: String, index: true },
    mouseTrackLog: { type: [MouseTrackInfo], default:[]},
    urlId: {type: String, index: true}
});

MouseTrackSchema.methods.incrementClickCount = function(element,pageX,pageY,cb) {
    var parent = this;
    this.model('MouseTrackModel').update(
        {
            'applicationId':this.applicationId, 
            'urlId':this.urlId, 
            'mouseTrackLog.identifier': element+"X"+pageX+"Y"+pageY
        },
        {
            '$inc':{'mouseTrackLog.$.clickCount':1}
        },
        {
            'new': true
        },
        cb);
}

这允许我执行原子查询。欢迎任何其他解决方案。