更改属性类型后,Mongoose无法找到任何元素

时间:2016-11-13 21:09:05

标签: node.js mongodb mongoose

我最初有这两种模式:

var UserSchema = new Schema({
  first: String,
  last: String
});

var SaleSchema = new Schema({
  createdAt: Date,
  registeredBy: { type: Schema.ObjectId, ref: 'User' }
});

但我想编辑我的SaleSchema以保存用户名而不是ID,所以我将其更改为:

var SaleSchema = new Schema({
  createdAt: Date,
  registeredBy: String
});

接下来,我想编辑所有销售文档并将registrationBy上的用户ID替换为用户的全名,但我似乎无法执行find查询对旧ID而言。

长话短说,这个查询在mongoose上没有返回匹配项,但是它使用mongo控制台完美地运行:

猫鼬

Sale.find({ registeredBy: '57ea0cbb47431f0b43b87d42' })
  .then(results => res.json(results))
  .catch(err => res.status(500).json(err));
// result: []

MongoDB控制台

db.sales.find({ registeredBy: '57ea0cbb47431f0b43b87d42' })
// result: 8 elements

将我的架构属性修改回ObjectId后,mongoose查询再次起作用。由于我需要迁移到新的数据类型,我希望能够查询和存储这两种类型的值。这可能吗?

1 个答案:

答案 0 :(得分:1)

好问题这是一个复杂的边缘案例。我并不特别熟悉Mongoose,但实现此目的的一种方法是在较低级别迁移数据。例如,创建一个使用低级mongo API进行迁移的mongo脚本,类似于:

db.sales.find().forEach(function(doc){
  var user = db.users.find({ _id: doc.registeredBy });
  db.sales.update({ _id: doc._id, }, {
    $set: { registeredBy: user.first + ' ' + user.last }
  });
});

这类似于https://github.com/balmasi/migrate-mongoose之类的模块,但我个人发现直接在cli上使用mongo脚本更容易。

mongo < sale-schema-migration.js