当我在控制台中执行以下操作时,我得到一个nameID和一个最小值
db.prices.aggregate([
{"$match":{ nameID: { '$in': [ ObjectId('longid') ] } } }//replaced the actual value with longid
,{"$group":{"_id":"$nameID","nameID":{"$first": "$nameID"} ,"min":{"$min":"$price"},"max":{"$max":"$price"}}}
,{"$sort":{"min":1}}
,{"$limit":5}
])
当我在猫鼬中时,我得到一个空数组:
Price.aggregate([
{"$match":{ nameID: { '$in': [ 'longid' ] } }}//replaced the actual value with longid
,{"$group":{"_id":"$nameID","nameID":{"$first": "$nameID"} ,"min":{"$min":"$price"},"max":{"$max":"$price"}}}
,{"$sort":{"min":1}}
,{"$limit":5}
],function(){}//needs a callback passed or no promise is returned
).then(function(res){
console.log('got a totals:',res);//res is [] here
return Price.find({ nameID: { '$in': [ 'longid' ] } }}).exec();
}).then(function(res){
console.log(res.length);//yes, got 3 records
console.log(res[0]['price']);//yes, the price
使用查询执行Price.find可以获得3条记录。
我是否遗漏了某些东西,或者这是猫鼬的已知问题?
[UPDATE]
使用聚合我不能将id作为字符串传递,因此转换为ObjectId并且它有效。以下是一个示例:
Price.aggregate([
{"$match":{ nameID: { '$in': [
new mongoose.Types.ObjectId('longid')//replaced the actual value with longid
]
}
}}
...
答案 0 :(得分:3)
糟糕。从您上次评论到我上次评论,您已在此处突出显示此问题。在大多数情况下,Mongoose将根据应用的模式“检查”并将“类型”转换为模型以进行操作。它不能和“不会”在聚合管道中执行此操作。所以你需要这样做:
var ObjectID = require("mongodb").ObjectID;
var actual_hex_string; // as received from input parameters
// then
Price.aggregate([
{"$match":{
"nameID": {
"$in": [ ObjectID(actual_hex_string) ]
}
}}
(...) // the rest of the pipeline
此外,$in
似乎不合适,除非您打算在此处使用可能(并已转换)ObjectID
值的实际“数组”。不要误以为“nameID”是一个“数组”因此你必须使用$in
。 MongoDB不关心这是一个数组还是一个值。 $in
用于同一字段的$or
上下文中的“多个匹配”。简单的相等匹配对于文档中的“数组”也同样适用。