Mongoose Aggregate在没有find()的情况下不起作用

时间:2014-08-06 16:44:14

标签: node.js mongoose

我不确定究竟发生了什么,但我有一个Model#aggregate()来电,当它前面有一个Model#find()时,却没有。这是我正在使用的代码(具有虚拟属性,Thing是我的模型对象):

var query = { my_ids: { $in: _.pluck(this.related_ids, 'my_ids') } };

// This Thing.find is never executed and shouldn't ever be needed.
Thing.find(query);

Thing.aggregate([
    { $match: query },
    { $group: { _id: null, "amount": { "$sum": "$amount" } } },
]).exec(function(error, result) {
    // blah blah blah
});

按原样运行时,它按预期工作 - 回调的结果为[{ _id: null, amount: <some number> }],如预期的那样。但是,如果Thing.find(query);被注释掉,那么它只是一个空白数组[]

我知道Thing.find()正在返回一个Query对象,可能会在后台设置一些状态,这可能会让aggregate()调用完成,但是当查询时它也不起作用执行(我假设将重置这些状态变量)。我很高兴离开Thing.find(query)调用以使其现在正常工作,但它确实让我的眼睛稍微抽搐了一下。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

找到它,有点愚蠢的解决方案,但在SO上找到类似问题的答案是件好事。

问题:竞争条件。我看到的第二个&#34;这件事似乎影响了一件无关紧要的事情&#34;在使用Node.js的时候,我的思想应该已经消失了。在代码填充数据库的某些代码(这是在测试中)之后,此代码会立即发生,并且发生了一些未被捕获的验证错误。在任何情况下,都没有将对象保存到数据库中,因此在Thing.find()调用稍有延迟的情况下,它会延迟聚合直到它们被保存。