【问题标题】:mongoose populate nested array with condition for array element猫鼬用数组元素的条件填充嵌套数组
【发布时间】:2016-11-14 09:42:02
【问题描述】:

我有一个包含文章的 ArticleGroup,模型看起来像这样

var ArticleGroup = new mongoose.Schema({
    articles:[{type:mongoose.Schema.Types.ObjectId,ref:'Article'}]
})

var Article = new mongoose.Schema({
    rates:[{
        uid:String,
        rate:Number //user's rate number to this article
    }]
})

现在一个用户(我们称他为 JACK)想要对 ArticleGroup 执行查询,填充该组中的文章,选择归档的费率

通常我会这样做

ArticleGroupModel
    .findById(articleGroupId)
    .populate('articles','rates')
    .select('articles')
    .exec((err, articleGroup) => {
         if (err) return next(err)
         //...
    })

但现在我只想要 JACK 的费率 如果一篇文章有​​ JACK 的评分,就这样返回那篇文章

{
    _id:"23jrf23orj89p3fwje4",
    rates:[{
        uid:"JACK's uid",
        rate:"JACK's rate number"
    }]
}

如果一篇文章没有 JACK 的费率,则该文章仍会被填充,但像这样归档的是空费率

{
     _id:"23jrf23orj89p3fwje4",
     rates:[]
}

有什么办法吗?

【问题讨论】:

    标签: arrays node.js mongodb mongoose mongoose-populate


    【解决方案1】:

    为了获得这个结果,您应该重新考虑您的数据模型,如下所示:

    ArticleGroup = new mongoose.Schema
        some details here ...
    
    ArticleRate = new mongoose.Schema
        uid: String
        rate: Number
    
    Article = new mongoose.Schema
        group:
            type: mongoose.Schema.ObjectId
            ref: 'ArticleGroup'
        rates:[ArticleRate]
    

    并执行这种查询:

    Article
    .find(group: groupId)
    .populate({
       path: 'rates',
       match: { uid: { $in: { JACK_UID } } },
       select: 'rate'
     })
     .exec();
    

    您可以在Mongoose documentation 中找到更多有用的信息。

    【讨论】:

    • 嗯,改变数据模型不是很容易......但是谢谢你的解决方案,我会考虑的
    猜你喜欢
    • 2015-11-24
    • 2021-10-15
    • 2019-02-24
    • 2021-06-29
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 2022-01-25
    相关资源
    最近更新 更多