Mongoose でドキュメントを更新/挿入するにはどうすればいいですか? 質問する

Mongoose でドキュメントを更新/挿入するにはどうすればいいですか? 質問する

おそらくそれは時間のせいでしょうし、あるいは私がまばらなドキュメントに溺れ、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
});

ここで問題に遭遇します:

  1. 電話をかけると、contact.save(function(err){...})同じ電話番号の連絡先がすでに存在する場合はエラーが表示されます(予想どおり、一意です)。
  2. update()そのメソッドがドキュメントに存在しないため、連絡先を呼び出すことはできません
  3. モデルに対して update を呼び出すと、
    Contact.update({phone:request.phone}, contact, {upsert: true}, function(err{...})
    Mongoose の更新実装では明らかに 2 番目のパラメーターとしてオブジェクトを必要としないため、ある種の無限ループに陥ります。
  4. 同じことを行うが、2 番目のパラメータでリクエスト プロパティの連想配列を渡すと{status: request.status, phone: request.phone ...}、機能しますが、特定の連絡先への参照がなくなり、そのプロパティを見つけることができませcreatedAtupdatedAt

つまり、結局のところ、私が試した結果、ドキュメントが与えられた場合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 では、このメソッドによるこれらのフックはサポートされていません。

  • デフォルト
  • セッター
  • バリデーター
  • ミドルウェア

おすすめ記事