Model.aggregate给出了与mongo控制台不同的结果(没有mongoose)

时间:2015-03-11 09:09:19

标签: node.js mongodb mongoose mongodb-query aggregation-framework

当我在控制台中执行以下操作时,我得到一个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
      ] 
    } 
 }}
 ...

1 个答案:

答案 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上下文中的“多个匹配”。简单的相等匹配对于文档中的“数组”也同样适用。