我有一个Book模式,如下所示:
{
title: String,
name: {
enVersion: String,
frVersion: String
}
}
我正在返回一个带有这个的书籍列表,我用版本的值替换名称字段,该值存储在版本变量中。
Book
.find(query)
.exec()
.then(books => _.map(books, b => Object.assign({}, b, { name: b.name[version])))
.then(books => reply(books))
.catch(err => reply(err))
问题在于,Object.assign()
正在返回的对象似乎来自另一个星球。为了使它工作,我必须用这个替换该行:
.then(books => _.map(books, b => Object.assign({}, b._doc, { name: b._doc.name[version])))
我知道应该采取不同的方式,请帮助。
答案 0 :(得分:2)
由于您正在使用mongoose
并且您想要使用普通对象,因此您可能希望将代码更改为:
Book
.find(query)
.exec()
.then(books => _.map(books, b => b.toObject()) // The important line
.then(books => _.map(books, b => Object.assign({}, b, { name: b.name[version])))
.then(books => reply(books))
.catch(err => reply(err))
对toObject
的调用将您的Book文档转换为纯JavaScript对象,而没有任何Mongoose特定逻辑。
答案 1 :(得分:1)
可能你可以使用内置的toObject()
或toJSON()
mongoose方法
.then(books => _.map(books, b => { ...b.toObject(), { name: b.name[version] }))
您还可以在模型上设置virtual
,该模型将根据区域设置或method
返回当前名称,具体取决于具体情况。 Mongoose模式选项(第二个参数)允许控制将哪些虚拟包含在toObject()和toJSON()
BookSchema.virtual('localname').get(function() {
return this.name[CURRENT_LOCALE];
});
BookSchema.method('getLocalname', function(locale) {
return this.name[locale];
});