Mongoose JS:返回填充数据

时间:2017-09-22 17:03:14

标签: node.js mongodb mongoose mongoose-populate

我正在尝试构建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"
}

我尝试使用Mongoose的populate

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

我得到了

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

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

另外,我在想是否可以通过id"来查找" find类别。代码为猫鼬的吸气剂和二传手:

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中实现这些功能?

感谢。

1 个答案:

答案 0 :(得分:0)

每当你填充时,populate应该出现在回调函数之前,因为我们需要填充的对象,所以我们把它放在.exec()之前。

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