おそらくそれは時間のせいでしょうし、あるいは私がまばらなドキュメントに溺れ、Mongoose での更新の概念を理解できないせいかもしれません :)
取引内容は次のとおりです。
連絡先スキーマとモデル(短縮されたプロパティ)があります。
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var mongooseTypes = require("mongoose-types"),
useTimestamps = mongooseTypes.useTimestamps;
var ContactSchema = new Schema({
phone: {
type: String,
index: {
unique: true,
dropDups: true
}
},
status: {
type: String,
lowercase: true,
trim: true,
default: 'on'
}
});
ContactSchema.plugin(useTimestamps);
var Contact = mongoose.model('Contact', ContactSchema);
必要なフィールドを含むリクエストをクライアントから受け取り、次のようにモデルを使用します。
mongoose.connect(connectionString);
var contact = new Contact({
phone: request.phone,
status: request.status
});
ここで問題に遭遇します:
- 電話をかけると、
contact.save(function(err){...})
同じ電話番号の連絡先がすでに存在する場合はエラーが表示されます(予想どおり、一意です)。 update()
そのメソッドがドキュメントに存在しないため、連絡先を呼び出すことはできません- モデルに対して update を呼び出すと、
Contact.update({phone:request.phone}, contact, {upsert: true}, function(err{...})
Mongoose の更新実装では明らかに 2 番目のパラメーターとしてオブジェクトを必要としないため、ある種の無限ループに陥ります。 - 同じことを行うが、2 番目のパラメータでリクエスト プロパティの連想配列を渡すと
{status: request.status, phone: request.phone ...}
、機能しますが、特定の連絡先への参照がなくなり、そのプロパティを見つけることができませcreatedAt
んupdatedAt
。
つまり、結局のところ、私が試した結果、ドキュメントが与えられた場合contact
、それが存在する場合はそれを更新し、存在しない場合は追加するにはどうすればよいでしょうか?
御時間ありがとうございます。
ベストアンサー1
Mongooseはこれをネイティブにサポートするようになりました一つを見つけて更新(MongoDBを呼び出す検索と変更)。
upsert = true オプションは、オブジェクトが存在しない場合にオブジェクトを作成します。デフォルトは false です。
var query = {'username': req.user.username};
req.newData.username = req.user.username;
MyModel.findOneAndUpdate(query, req.newData, {upsert: true}, function(err, doc) {
if (err) return res.send(500, {error: err});
return res.send('Succesfully saved.');
});
古いバージョンの Mongoose では、このメソッドによるこれらのフックはサポートされていません。
- デフォルト
- セッター
- バリデーター
- ミドルウェア