node.js - 猫鼬聚合不起作用,尝试了不同的方法仍然无法解决问题,甚至不知道是什么问题
问题描述
我是节点和猫鼬的新手。尝试了很多方法,但没有一个对我有用。
- 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" } } }
]);
- mongoose 中的聚合查询:-
Model.aggregate([
{ $match: { p_id: pId, m_id: { $in: mIds } } },
{ $sort: { updated_at: 1 } },
{
$group: {
_id: "$m_id",
evaluation: { $last: "$evaluation" }
}
}
]);
错误:- 需要抛出光标选项
- 添加游标选项后的聚合查询:-
询问:-
Model.aggregate(
[
{ $match: { p_id: pId, m_id: { $in: mIds } } },
{ $sort: { updated_at: 1 } },
{
$group: {
_id: "$m_id",
evaluation: { $last: "$evaluation" }
}
}
],
{ cursor: {} }
);
错误:-error_stack=错误:参数必须是聚合管道运算符
- 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",
解决方案
我不得不尝试不同的东西,最后以下查询对我有用。
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});
我必须做的三件事:
我必须只在 $match 中传递 objectIds,因为在正常的查找字符串工作中,猫鼬能够在内部将字符串转换为 objectIds。对于聚合必须在 $match 中传递 objectIds。
必须通过光标选项。根据 [https://docs.mongodb.com/manual/reference/command/aggregate/#dbcmd.aggregate][1] 光标在 mongodb 3.6 版本之后是强制性的。我的 mongodb 版本 id 4.0.5 。
必须在异步模式cursor({async:true})中传递 cursor 。从游标获得结果为 cursor.toArray()。
推荐阅读
- javascript - 将函数传递给反应类
- sql - 使用另一个表中的值更新一个表(该表有 3 个键,而在另一个匹配表中仅找到 2 个键)
- sql - 按/排序分区是否暗示查询中的排序?
- c - luajit ffi - 如何在 ffi/luajit 中编写指向 ac 函数的指针
- javascript - 如何在 WebGL 中使用键盘更改对象颜色?
- shopify - Shopify:主题观看后 Themekit 自动处理模板/客户
- java - 针对多个单词查询文档
- python - 提高 Python 中嵌套 for 循环的性能
- python - 他们是调用函数的方法,无论变量是否更改值,而不使用面向对象编程?
- c++ - 在 Windows 上使用 CMake 编译 SFML 程序