[解決済み] Mongooseで文書を更新/アップサートするにはどうしたらいいですか?
2022-03-20 15:51:38
質問
時間のせいなのか、まばらなドキュメントに溺れ、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()
というメソッドがドキュメントに存在しないため、contact で使用されます。 -
モデルでupdateを呼び出すと。
Contact.update({phone:request.phone}, contact, {upsert: true}, function(err{...})
Mongoose のアップデート実装は明らかにオブジェクトを2番目のパラメーターとして必要としていないので、ある種の無限ループに陥ってしまいます。 -
同じことをしても、2番目のパラメータにリクエストプロパティの連想配列を渡します。
{status: request.status, phone: request.phone ...}
は動作しますが、特定の連絡先への参照がなく、その連絡先のcreatedAt
とupdatedAt
プロパティを使用します。
というわけで、結局のところ、私が試した限りでは、あるドキュメントが与えられると
contact
存在する場合はどのように更新し、存在しない場合はどのように追加するのでしょうか?
お忙しい中、ありがとうございました。
解決方法は?
さて、長い間待っても答えは出ませんでした。最終的に、更新/アップサートをあきらめ、次の方法をとりました。
ContactSchema.findOne({phone: request.phone}, function(err, contact) {
if(!err) {
if(!contact) {
contact = new ContactSchema();
contact.phone = request.phone;
}
contact.status = request.status;
contact.save(function(err) {
if(!err) {
console.log("contact " + contact.phone + " created at " + contact.createdAt + " updated at " + contact.updatedAt);
}
else {
console.log("Error: could not save contact " + contact.phone);
}
});
}
});
うまくいくか?うん。私はこれで満足ですか?おそらくそうではないでしょう。1回のDB呼び出しの代わりに2回のDB呼び出し。
将来のマングース実装が、このような
Model.upsert
という関数があります。
関連
-
[解決済み】React - uncaught TypeError: 未定義のプロパティ 'setState' を読み取れない
-
[解決済み】ERROR エラーです。スイッチのname属性が指定されていないフォームコントロールの値アクセッサがない
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] jQueryで要素が非表示になっているかどうかを確認するには?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] GUID / UUIDの作成方法
-
[解決済み] package.jsonの各依存関係を最新バージョンに更新する方法は?
-
[解決済み] jQueryを使用しない$(document).ready相当
-
[解決済み】別のウェブページにリダイレクトするにはどうすればいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
親子コンポーネント通信を解決する3つのVueスロット
-
vueはopenlayersを使用してスカイマップとガオードマップをロードする
-
vueディレクティブv-bindの使用と注意点
-
VUEグローバルフィルターの概念と留意点、基本的な使い方
-
Vueのクラススタイルの使い方の詳細
-
[解決済み】React - uncaught TypeError: 未定義のプロパティ 'setState' を読み取れない
-
[解決済み】Node.js getaddrinfo ENOTFOUND
-
[解決済み】gulp anythingを実行するたびに、アサーションエラーが発生します。- タスク関数を指定する必要があります
-
[解決済み] Web API エラー - このリクエストはブロックされました; コンテンツは HTTPS で提供されなければなりません
-
[解決済み】 env: node: macにそのようなファイルやディレクトリはありません