2016-11-13 42 views
0

我本來有兩個模式:貓鼬找不到更改屬性類型之後的任何元素

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 
}); 

接下來,我想編輯所有的銷售文件和更換registeredBy的用戶ID的用戶的全名,但我似乎無法能夠舊ID的執行find查詢。

長話短說,這個查詢返回貓鼬沒有比賽,但它完美使用蒙戈控制檯:

貓鼬

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 

後,我修改我的schema的屬性返回到ObjectId,mongoose查詢再次工作。由於我需要遷移到新的數據類型,我希望能夠查詢和存儲這兩種類型的值。這可能嗎?

回答

1

好問題這是一個複雜的邊緣情況。我對Mongoose沒有特別的熟悉,但實現這一目標的一種方法是將數據遷移到較低的級別。例如,創建一個使用低級別的API蒙哥做遷移蒙戈腳本,沿着線的東西:

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