[解決済み] Mongoose - ドキュメントが存在しない場合は作成、そうでない場合は更新 - いずれの場合もドキュメントを返す
質問
自分のコードの一部をより短くシンプルにリファクタリングする方法を探しているのですが、Mongooseのことをよく知らないので、どうしたらいいのかわかりません。
私はドキュメントが存在するかどうかコレクションをチェックし、それが存在しない場合、それを作成しようとしています。存在する場合は、それを更新する必要があります。どちらの場合でも、私はその後、ドキュメントのコンテンツにアクセスする必要があります。
私がこれまで何とかやってきたことは、特定のドキュメントをコレクションに問い合わせ、それが見つからなければ、新しいドキュメントを作成することです。見つかった場合は、それを更新します (現在、このためにダミー データとして日付を使用しています)。そこから、見つかったドキュメントにアクセスするには、最初の
find
操作から見つかったドキュメントまたは新しく保存されたドキュメントのいずれかにアクセスでき、これは動作しますが、私が求めていることを達成するためのより良い方法があるはずです。
これが私の作業コードで、気が散るような余分なものを除いたものです。
var query = Model.find({
/* query */
}).lean().limit(1);
// Find the document
query.exec(function(error, result) {
if (error) { throw error; }
// If the document doesn't exist
if (!result.length) {
// Create a new one
var model = new Model(); //use the defaults in the schema
model.save(function(error) {
if (error) { throw error; }
// do something with the document here
});
}
// If the document does exist
else {
// Update it
var query = { /* query */ },
update = {},
options = {};
Model.update(query, update, options, function(error) {
if (error) { throw error; }
// do the same something with the document here
// in this case, using result[0] from the topmost query
});
}
});
を調べたところ
findOneAndUpdate
やその他の関連するメソッドを調べましたが、私の使用例に合っているかどうか、またその使用方法を正しく理解しているかどうかわかりません。どなたか正しい方向を示していただけませんか?
(おそらく)関連する質問
- 更新中にそのデータがすでにデータベースに存在するかどうかを確認する方法 (Mongoose And Express)
- Mongoose.js: create や update を実装するには?
- NodeJS + Mongo: 存在しない場合は挿入、それ以外は更新
- Mongoose で更新されたコレクションを返す
編集
検索しても指摘された質問には出会えませんでしたが、そこで回答を見直して、このように思いつきました。私の意見では、確かにそれはよりきれいであり、それは動作するので、私が何かひどく間違っていない限り、私の質問はおそらく閉じられると思います。
私は、私の解決策について追加の意見を感謝します。
// Setup stuff
var query = { /* query */ },
update = { expire: new Date() },
options = { upsert: true };
// Find the document
Model.findOneAndUpdate(query, update, options, function(error, result) {
if (!error) {
// If the document doesn't exist
if (!result) {
// Create it
result = new Model();
}
// Save the document
result.save(function(error) {
if (!error) {
// Do something with the document
} else {
throw error;
}
});
}
});
どのように解決するのですか?
あなたが探しているのは
new
オプション・パラメータを探しています。このパラメータは
new
オプションは、新しく作成されたドキュメントを返します(新しいドキュメントが作成された場合)。以下のように使用します。
var query = {},
update = { expire: new Date() },
options = { upsert: true, new: true, setDefaultsOnInsert: true };
// Find the document
Model.findOneAndUpdate(query, update, options, function(error, result) {
if (error) return;
// do something with the document
});
以降
upsert
はドキュメントが見つからなければドキュメントを作成するので、手動で別のドキュメントを作成する必要はありません。
関連
-
[解決済み] Mongooseで文書を更新/アップサートするにはどうしたらいいですか?
-
[解決済み】Mongoose: findOneAndUpdateが更新されたドキュメントを返さない
-
[解決済み] 上級者向けJavaScript。この関数はなぜ括弧でくくられるのですか?重複
-
[解決済み] 文字列のn番目の出現箇所を取得するには?
-
[解決済み] node.jsで文字列のsha1ハッシュを取得するにはどうすればよいですか?
-
[解決済み] JavaScriptを使用してHTML要素に属性を追加/更新するには?
-
[解決済み] オブジェクトの配列からReactコンポーネントをレンダリングする
-
[解決済み] JavaScriptでの大文字小文字を区別しない正規表現
-
[解決済み] コールバック地獄とは何か、RXはそれをどのように、そしてなぜ解決するのか?
-
[解決済み] リダイレクトされずにHTMLフォームを送信する方法
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Mongooseで文書を更新/アップサートするにはどうしたらいいですか?
-
[解決済み] AngularJSのエラーです。Cross Origin リクエストはプロトコルスキーム http, data, chrome-extension, https に対してのみサポートされています。
-
[解決済み] 配列からオブジェクトを生成する
-
[解決済み] ExtJS 4のイベントハンドリングについて
-
[解決済み] 文字列がhtmlであるかどうかをチェックする
-
[解決済み] Javascript 空の配列の削減
-
[解決済み] サブドメインにまたがってlocalStorageを使用する
-
[解決済み] Chromeの拡張機能開発にWebStormを使用するにはどうすればよいですか?
-
[解決済み] Node.jsのES6クラスをrequireで作る
-
[解決済み] JavaScriptとLuaの微妙な違い [終了しました]