首页 > 解决方案 > 使用 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参数时,它会抛出一个错误,因为这些字段似乎是强制性的。我只想添加一个条件“计算时间戳低于当前条目的所有条目”。知道我该怎么做吗?

标签: javascriptnode.jsmongoosevirtual

解决方案


mySchema.virtual('count').get( async function() {
    return await collection.count(.....);
})

除了使用上述内容之外,您还需要 mongoose-lean-virtuals 以便在使用 .lean(); 时显示计数;

说明:您的方法还需要 mongoose 调用附加查询。


推荐阅读