Mongoose 聚合查询在 Jest/Mockgoose 测试中失败,在其他地方工作
Posted
技术标签:
【中文标题】Mongoose 聚合查询在 Jest/Mockgoose 测试中失败,在其他地方工作【英文标题】:Mongoose aggregation query fails in Jest/Mockgoose test, works elsewhere 【发布时间】:2017-09-12 13:06:47 【问题描述】:我正在尝试为我的 Mongoose 模型创建一些测试,但我不知道如何让 Jest/Mockgoose 测试通过我的速记查询/聚合管道(见下文第一个代码块)创建用于从一个集合中检索未在另一个集合中引用的随机文档。
activitySchema.query.getUnused = function()
return Activity.aggregate()
.lookup(
from: 'userActivity',
localField: '_id',
foreignField: 'activity',
as: 'matched_docs',
)
.match( matched_docs: $eq: [] )
.sample(1)
.project( matched_docs: 0, __v: 0 )
.exec()
玩笑测试
describe('Activity methods', () =>
test('Activity unused query executes', (done) =>
function createActivity()
return Activity
.create( activity: 'running' )
.then(activity =>
console.log('Activity is generated')
return Promise.resolve(true)
)
async function retrieveActivity()
await createActivity()
Activity
.find()
.getUnused()
.then(unused =>
console.log(unused);
expect(unused).toHaveLength(1)
done()
)
.catch(x =>
console.log(x)
)
return retrieveActivity()
)
)
沙盒节点 JS 代码:
Activity.find().getUnused()
.then((x) =>
console.log(x);
)
当我在沙盒节点文件中尝试它时,wit 可以正常工作并检索典型的查询集,例如:
[ _id: 58f3dee3b0346910a69e6e5d, activity: 'running', __v: 0 ]
当我运行测试时,我得到了这个 MongoError:
The 'cursor' option is required, except for aggregation explain
如何以一种适用于两种情况的通用方式解决此问题?如果可能的话,我希望该方法返回一个承诺。我已经尝试了链式聚合方法(见上文)和管道的更原生的 Mongo 聚合数组,但都返回错误。如果相关的话,我的 mongo 版本是 3.4.2。
【问题讨论】:
【参考方案1】:我遇到过类似的问题,经过大量研究后,我发现这是由于旧版本的 mongoose 造成的,因为早期版本与 MongoDB 3.6 及更高版本中的重大更改不兼容。
我一一升级了猫鼬版本,我发现它与猫鼬版本4.12.2
或更高版本(mongoose@4.12.2).
完美配合
您可以通过运行以下命令来升级您的猫鼬版本:
npm install mongoose@4.12.2
【讨论】:
【参考方案2】:终于想通了:我必须在聚合管道中添加一个游标调用,并将其转换为流。为了维护 Promise 我有查询方法 流结束后返回一个用数据解析的 Promise,如下所示:
activitySchema.query.getUnused = function()
return new Promise((res, rej) =>
let data = []
return Activity.aggregate()
.lookup(
from: 'userActivity',
localField: '_id',
foreignField: 'activity',
as: 'matched_docs',
)
.match( matched_docs: $eq: [] )
.sample(1)
.project( matched_docs: 0, __v: 0 )
.cursor()
.exec()
.on('data', doc => data.push(doc))
.on('end', () => res(data))
)
【讨论】:
只有在使用 mongo 3.5 时才会出现此问题。*以上是关于Mongoose 聚合查询在 Jest/Mockgoose 测试中失败,在其他地方工作的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose,使用 $lookup 的聚合查询返回 null?
如何在 MongoDB 中对聚合查询结果进行分页并获得总文档数(Node.js + Mongoose)?
mongoDB,带有 $sum 和 $count 的 mongoose 聚合查询