MongoDB:.exec()承诺:必须使用.doc从Object.assign()获取文档

时间:2018-01-25 15:04:56

标签: javascript mongodb mongoose

我有一个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])))

我知道应该采取不同的方式,请帮助。

2 个答案:

答案 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];
});