2016-11-13 5 views
0

プロパティタイプを変更した後、任意の要素を見つけることができません。マングースは、私はもともとこれらの2つのスキーマ持っ

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

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

をしかし、私は代わりにIDのユーザー名を保存するために、私のSaleSchemaを編集したいので、私はそれを変更しました:

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 

私を変更した後スキーマのプロパティをObjectIdに戻すと、mongooseクエリが再び機能します。私は新しいデータ型に移行する必要があるので、両方の型の値をクエリして格納できるようにしたい。これは可能ですか?

答えて

1

良い質問これは複雑なエッジケースです。私は特にMongooseをよく知っているわけではありませんが、これを行う方法の1つは、より低いレベルでデータを移行することです。たとえば、の線に沿って何かを移行を行うための低レベルの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のようなモジュールが何に似ていますが、私は個人的に見つけましたmongoスクリプトをcliで直接使用する方が簡単です。

mongo < sale-schema-migration.js 
関連する問題