【问题标题】:Mongoose JS: return populated dataMongoose JS:返回填充数据
【发布时间】:2017-09-23 21:48:16
【问题描述】:

我正在尝试构建一个 CMS,我可能在 DB 中有这样的东西:

// an article in Article collection
{
    "_id": ObjectId("1234"),
    "title": "JavaScript Basics",
    "category": ObjectId("0001")
}

// a category in Category collection
{
    "_id": ObjectId("0001"),
    "name": "JavaScript"
}

出于某些原因,我必须将类别放在集合中,而不是嵌入文档中。 获取文章时,我想获取这样的信息:

{
    "title": "JavaScript Basics",
    "category": "JavaScript"
}

我尝试使用猫鼬的populate:

Article.findOne({_id: "1234"})
.populate('tags', 'name -_id')
.exec()
.then(article => { /* ... */ })

我得到了

{
    "title": "JavaScript Basics",
    "category": {"name": "JavaScript"}
    // compare to: "category": "JavaScript"
}

所以我必须处理category,我认为这不是很优雅。有没有办法解决这个问题?

另外,我正在考虑是否可以将“按 id 查找类别”代码放入 mongoose 的 getter 和 setter:

ArticleSchema.path('category')
.set(function(categoryName) {
    // find categoryId by categoryName and set it
})
.get(function(categoryId) {
    // find category name by id and return it
});

如果它有效就很好,我不需要面对前面提到的问题。但是这里似乎不支持异步代码(按id查找类别),是否有可能在mongoose的setter和getter中实现这些东西?

谢谢。

【问题讨论】:

    标签: node.js mongodb mongoose mongoose-populate


    【解决方案1】:

    无论何时填充,populate 都应该出现在回调函数之前,因为我们需要填充的对象,所以我们将它放在 .exec() 之前。

    Article.findOne({_id: "1234"}).populate('tags', 'name').exec(function(err,article){})
    

    【讨论】:

    • 请在您的回答中添加一些上下文,以便人们更好地理解您的回答
    猜你喜欢
    • 1970-01-01
    • 2017-05-19
    • 2014-11-02
    • 2016-12-04
    • 2020-11-11
    • 2019-06-17
    • 1970-01-01
    • 2021-01-02
    • 2017-10-26
    相关资源
    最近更新 更多