我最初有这两种模式:
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查询再次起作用。由于我需要迁移到新的数据类型,我希望能够查询和存储这两种类型的值。这可能吗?
答案 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