【发布时间】:2013-04-25 00:07:38
【问题描述】:
相对简单的场景:
我有这个Voucher 对象,它有一个user 属性(ObjectId 类型)。我想获取单个用户的所有凭证值的总和。这是我当前的策略,它返回一个空数组:
Voucher.aggregate [
{ $match : { user : new ObjectId(user_id), expires : { $gt : new Date() } } }
{ $group : { _id : null, sum : { $sum : '$value' } } }
], (err, result)->
console.log err
console.log result
删除user id 的匹配项并保留expires 字段将返回结果。那么问题就变成了user上的匹配有什么问题?
【问题讨论】:
-
我无法重现这个;
$match在普通的 mongo shell 中使用ObjectId为我工作。我不知道你代码块中的dc是什么。那是猫鼬的事吗? -
具体来说,这是我在 mongo shell 中所做的:在我的测试数据库中,我做了
db.tmp.save({foo: ObjectId()})。然后在用findOne找到它的ID 后,我做了db.users.aggregate({$match:{foo:ObjectId("5180956a55064fce4d42f02d")}})并在结果中返回了该文档。您可以试试这个,然后尝试将您的问题减少到问题的最小示例吗?顺便说一句,我正在使用 Mongo 2.4.3。 -
嗨,道格,感谢您的帮助。 dc 是一个带有一些助手(如对象 ID)的上下文对象。所以请忽略这一点。我将聚合减少到
{ $match : { user : new ObjectId(user_id) } }并且仍然收到[]的结果。 -
在 mongo shell 中运行相同的聚合是有效的。
-
感谢Doug的帮助,最终让我找到了错误。
标签: mongodb mongoose aggregation-framework