首页 > 解决方案 > 猫鼬聚合不起作用,尝试了不同的方法仍然无法解决问题,甚至不知道是什么问题

问题描述

我是节点和猫鼬的新手。尝试了很多方法,但没有一个对我有用。

  1. mongo shell 上的聚合查询正在运行,这里是查询:-
db.collection.aggregate([
  {
    $match: {
      p_id: ObjectId("5d8b4f24d86d9f2400d7ff46"),
      m_id: { $in: [ObjectId("5dde14b3f34ac02500a2b0aa")] }
    }
  },
  { $sort: { updated_at: 1 } },
  { $group: { _id: "$m_id", evaluation: { $last: "$evaluation" } } }
]);
  1. mongoose 中的聚合查询:-
Model.aggregate([
  { $match: { p_id: pId, m_id: { $in: mIds } } },
  { $sort: { updated_at: 1 } },
  {
    $group: {
      _id: "$m_id",
      evaluation: { $last: "$evaluation" }
    }
  }
]);

错误:- 需要抛出光标选项

  1. 添加游标选项后的聚合查询:-

询问:-

Model.aggregate(
  [
    { $match: { p_id: pId, m_id: { $in: mIds } } },
    { $sort: { updated_at: 1 } },
    {
      $group: {
        _id: "$m_id",
        evaluation: { $last: "$evaluation" }
      }
    }
  ],
  { cursor: {} }
);

错误:-error_stack=错误:参数必须是聚合管道运算符

  1. Mongoose 聚合 api 流利地返回聚合光标,但在执行聚合cursor.next() 时,承诺以挂起状态返回。在aggregationcursor.next() 上添加then() 后,将返回一个空对象:-
Model.aggregate()
  .match({ p_id: pId, m_id: { $in: mIds } })
  .sort({ $updated_at: 1 })
  .group({
    _id: "$m_id",
    evaluation: { $last: "$evaluation" }
  })
  .cursor({ batchSize: 1000 });

架构:

const PSchema = new Schema({
  m_id: { type: Schema.Types.ObjectId },
  p_id: { type: Schema.Types.ObjectId },
  evaluation: { type: String, enum: _.values(EvaluationType) },
  created_at: { type: Date },
  updated_at: { type: Date }
});
Mongo/Mongoose version:-
"@types/mongoose": "^3.8.36",
"mongodb": "^3.3.5",
"mongoose": "~4.5.9",

标签: node.jsmongodbmongooseaggregation-framework

解决方案


我不得不尝试不同的东西,最后以下查询对我有用。

let cursor = Model.aggregate([
  {
    $match: {
     'p_id': mongoose.Types.ObjectId(providerId) ,'m_id': { $in:objectIds } 
    } 
  },
  {
    $sort: { 
      'updated_at':1
    }
  },
  {
    $group: {
      _id: '$m_id',
      evaluation: { $last: '$evaluation' }
    }
  }
]).cursor({async:true});

我必须做的三件事:

  1. 我必须只在 $match 中传递 objectIds,因为在正常的查找字符串工作中,猫鼬能够在内部将字符串转换为 objectIds。对于聚合必须在 $match 中传递 objectIds。

  2. 必须通过光标选项。根据 [https://docs.mongodb.com/manual/reference/command/aggregate/#dbcmd.aggregate][1] 光标在 mongodb 3.6 版本之后是强制性的。我的 mongodb 版本 id 4.0.5 。

  3. 必须在异步模式cursor({async:true})中传递 cursor 。从游标获得结果为 cursor.toArray()。


推荐阅读