javascript - 来自填充文档的 Mongoose 求和字段

标签 javascript node.js mongodb mongoose

我有两个模型:UserTrack用户可以完成每个Track并获得积分。

用户模式:

let userSchema = new mongoose.Schema({
    name: {type: String, required: true},
    completedTracks: [{
        type: mongoose.Schema.ObjectId,
        ref: 'Track',
    }],
});

跟踪模式:

let trackSchema = new mongoose.Schema({
  points: {
    type: Number,
    default: 0,
  }
});

我在 User 模型中存储对已完成轨道的引用。

我想做的是查询多个用户,只显示他们每个人完成的轨道的 _id 并添加有关在新的 score 中得分的总分的信息> 属性(property)。

我想达到的结果示例:

[
    {
        "completedTracks": [
            "5a9f14f18e04b3225953954c",
            "5aa5a8fa7367661c03f57a99",
            "5aa1aa5a7da9fd2946b01c04"
        ],
        "name": "Person 1",
        "score": 42,
        "id": "5aaab2c63d1a9d182b183a01"
    },
    {
        "completedTracks": [],
        "name": "Person 2",
        "score": 0,
        "id": "5aaab602c5bdc411d3cef3bd"
    }
]

我尝试创建可以返回分数的虚拟,但它不起作用,因为 user.completedTracks 只是 ObjectIds

userSchema.virtual('score').get(function() {
    return this.completedTracks.reduce((acc, doc) => acc + doc.points, 0);
});

最佳答案

您可以在 3.4 中尝试以下聚合。

$lookup 查找已完成轨道的分数,然后是 $addFields 以返回对分数求和的分数字段和 $project排除以从响应中删除查找数据字段。

UserModel.aggregate([
  {"$lookup":{
    "from":"tracks", // name of the foreign collection
    "localField":"completedTracks",
    "foreignField":"_id",
    "as":"lookup-data"
  }},
  {"$addFields":{
    "score":{
      "$sum":"$lookup-data.points"
    }
  }},
  {"$project":{"lookup-data":0}}
])

关于javascript - 来自填充文档的 Mongoose 求和字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49329538/

相关文章:

node.js - 如何使用node js child_process exec运行unix diff命令?

javascript - 如何更改LoopBack框架中的模型类

python - 从 Python 快速查询大型 MongoDB 集合

javascript - JS Cookie 设置在 2 个位置,不会覆盖第一个设置

javascript - jQuery 切换函数隐藏可见元素,即使参数是真实的

javascript - Node.js express : Passing data from URL and session into served JavaScript file

java - 我们如何从 JSON 文档中检索所有键及其前缀

.net - 从 ASP.NET 连接到远程 MongoDB 实例

javascript - 在鼠标移动时从 Canvas 获取像素颜色

javascript - Firebug 控制台窗口范围。为什么 "this"不总是相同的?