javascript - 使用 mongoose virtuals 有条件地计算条目
问题描述
我想在我的猫鼬模式中添加一个虚拟。virual 的目标是计算同一集合中小于引用文档的文档数。例如,我有以下集合:
const mySchema = new mongoose.Schema({
timestamp: {
type: Number
}
})
mySchema.virtual('count', {
ref: 'mySchema',
count: true,
localField: 'timestamp',
foreignField: 'timestamp',
match: function (ref, cmp) {
return ref.timestamp < cmp.timestamp // does not work
}
})
const M = mongoose.model('mySchema', mySchema)
因此,当我执行以下操作时:
await M.create({
timestamp: 10
})
await M.create({
timestamp: 20
})
await M.create({
timestamp: 30
})
console.log((await M.find({ timestamp: 30 })).count)
我在控制台中看到“未定义”,但由于匹配功能,“计数”应该是“2”,但是由于外部/本地字段匹配,这个函数永远不会被调用(我也不知道是否我可以访问匹配函数中的“ref”和“cmp”参数。当我删除foreign-/local-field参数时,它会抛出一个错误,因为这些字段似乎是强制性的。我只想添加一个条件“计算时间戳低于当前条目的所有条目”。知道我该怎么做吗?
解决方案
mySchema.virtual('count').get( async function() {
return await collection.count(.....);
})
除了使用上述内容之外,您还需要 mongoose-lean-virtuals 以便在使用 .lean(); 时显示计数;
说明:您的方法还需要 mongoose 调用附加查询。
推荐阅读
- javascript - Google Maps v3 自定义标记图标位于中心,并且不会保持其在地图上的位置
- python - 多处理观察者
- docker - ArangoDB 单实例作为 Docker 容器填充内存并重新启动
- opengl - 简单的 Shadertoy 到常规的 glsl
- node.js - NodeJS 发送到 POST 也是未经检查的输入
- ios - Firebase PushNotification 如何与 iOS APNS 配合使用完整说明?
- functional-programming - Wadler 中刻度方程的问题,“函数式编程的 Monads”,第 3 节
- typescript - 打字稿错误 - 不要将函数用作类型
- python - Jupyter Labs:将元组转换为 PandasData 帧时内核死机
- avr - SPI 实现停留在“while(!spi_is_tx_empty(WINC1500_SPI));”