問題タブ [mongodb-update]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mongodb - 埋め込みドキュメントへのフィールドの追加
MongoDB データベースに埋め込まれたドキュメントを多用していますが、データを追加しようとすると速度の問題が発生します。
例として、次のようなドキュメントがあります。
私がやりたいことは、次のように埋め込みドキュメントに 5 つの新しいフィールドを追加することです。
for ループで find().update_one() を使用してこれを開始し、埋め込まれた各ドキュメントを明示的に識別し、「$set」を使用してドキュメントを明示的に使用しました。このアプローチは機能しますが、非常に遅いです。私のコレクションが小さかった場合、これは問題にならないと確信していますが、それは巨大です (数億のドキュメント)。一連のフィールドを追加するたびにドキュメント全体を移動する必要があるため、おそらく非常に遅いでしょう。それを念頭に置いて、すべての埋め込みドキュメントに一度に新しいフィールドを追加しようとしました。これを行うには、検索クエリを空のままにし、「$set」コマンドから位置 $ を削除しました。これに少し似ています(pymongoで):
このアプローチはエラーをスローするようですcannot use the part (basket of basket.new_5) to traverse the element ({basket:......
私が間違っていることについて誰かが洞察を与えることができますか? これを行うことさえ可能ですか?
arrays - 要素を配列にプッシュする
次のjsonのように見えるtestという名前のコレクションがあります。
({x:99,y:99})
今、私は別の要素a.a1
を条件付きでプッシュしたいのでa.id=1
、次のコマンドを試しました:
一部( a.a1 のa)を使用して要素をトラバースできないというエラーメッセージを返すので、要素を配列に追加するにはどうすればよいですか?
arrays - マルチレベルの埋め込みドキュメントを更新する
mongoDB には非常に複雑なデータ構造があります。ドキュメントはこのように少し見えます
ドキュメントの配列を埋め込みドキュメントの exGroup 配列に追加して、各埋め込みドキュメントが次のようになるようにしたいと思います
次のような更新クエリでこれを実行しようとしました。
残念ながら、これによりエラー "fundId": 0, "date": ISODate("2016-11-21T11:00:00.000+0000"), "basket.assetId": 2500, "basket.exGroup.exgId": 0 が表示されます
基本的に私の問題は、マルチレベル配列 (つまり、doc.array.doc.array.doc) のリーフにあるドキュメントを正しくアドレス指定する方法がわからないことです。
mongodb - MongoDBは、またはクエリを使用して複数のサブドキュメントを更新します
一度に複数のサブドキュメントの更新クエリを作成したいと考えています。すべてのサブドキュメントのステータスをパッシブに設定し、クエリで指定した条件を満たします。
上記のクエリは、サブドキュメントを 1 つだけ見つけて、必要に応じて更新します。しかし;
クエリ セグメントに or を入力し、他の項目を追加すると、エラーが発生します。
ここで何が欠けていますか?
javascript - modifiedCount と upsertedCount の両方を 0 にすることはできますか?
オプションでupdate
ofmongodb
を使用すると、両方を取得して 0 にすることは可能でしょうか?{upsert:true}
upsertedCount
modifiedCount
upsertedCount
は作成された文書をmodifiedCount
指し、 は更新された文書を指すと理解しています。
したがって、 を使用してupsert
も、両方が 0 になるシナリオは見つかりません。
私が間違っている?
助けてくれてありがとう。
mongodb - mongodbは1つずつ検索して更新しますか、それともすべてを検索してからすべて更新しますか
mongodb では、複数のドキュメントを更新する書き込み操作はアトミックではありません。3 つのレコード A、B、C がある場合、更新する必要があります。
mongodb:
A を検索、A を更新、B を検索、B を更新、C を検索、C を更新
また
A、B、C を見つけてメモリに保存し、forEach で A、B、C を更新しますか?
javascript - MongoDB の複雑なドキュメント update() のアドレス指定の問題は何ですか?
MongoDB コレクションに到達できず、複雑なドキュメントの値を変更できませんでした。以下に示す 1 つの例よりも多くのバリエーション、あらゆる種類のバリエーションを試しましたが、失敗します。
Key「air」のValueを「rain」から「clear」に変更したいです。実生活では、キー「空気」の現在の値が「雨」であることはわかりません。
私は MongoDB _id オブジェクトを使用していないことに注意してください。これを使用せずにこれを達成したいと考えています。
weatherSys コレクションの 3 つのドキュメント:
更新-1: わかりました。あなたが提案したよりも少し単純なレイアウトを見つけられることを望んでいましたが、失敗しました。私が試したことはすべて、「空中」キーレベルではアドレス指定できませんでした。だから私はあなたの正確なJSONを私のコレクションにコピーして貼り付けて実行しました。コレクションの操作とテストに MongoChef を使用しています。
これは、JSON を 3 回貼り付けて 3 つのドキュメントを作成した新しいレイアウトです。
次に、「サンフランシスコ」ドキュメントの「air」キーを更新しようとしたところ、予期しない結果が得られました。"air":"dry" を更新するのではなく、"San Francisco" オブジェクトに新しい "air" キーを作成しました。
だから私は大丈夫だと思ったので、更新をもう一度試して、何が起こるか見てみましょう:
ご覧のとおり、以前に作成した「air」キーが更新されました。私はこれと戦って「私の」方法で機能させようとすることができましたが、それを機能させたいだけなので、「機能している」ものに沿ってコレクションのレイアウトを再構成します。
そして、更新を再度実行します。
次に、更新を再度実行して確認します。
動作します。マルチドキュメント環境で適切に更新しています。だから、これは私の現在の作業コレクションのレイアウトです:
これについていくつか質問があります-
すべてのドキュメントで最上位のキー「天気」を使用しています。ドキュメント内の情報には何も追加しません。そのキーとそれがもたらすオーバーヘッドを必要としないレイアウト設計の変更はありますか?
「天気」キーを使用する必要があるとしましょう。その値は配列ですが、その配列には、都市、空、空気、および地面のキーを含むオブジェクトという 1 つの要素しかありません。アドレス指定では、要素が 1 つだけの配列を使用する必要がありますか? それとも、私はそれを取り除くことができますか?"weather":[{}] の代わりに "weather":{} を設計することはできますか? または、アドレス指定できない問題が再び発生するのでしょうか?
キーの値のいずれかを update() できるようになりました: 空、空、地面ですが、ドキュメントの 1 つでキー「地面」の値を読み取ると言う find() 構造は何ですか?
----> OK、私はこの質問を持っていると思います #3- db.weatherSys.find({ "weather.city" : "San Francisco" }, { "weather.ground": 1 })
- あなたが提案した元のコレクション レイアウトで、あなたと私が期待したように更新されず、代わりに新しい「都市」オブジェクトを作成した理由を説明してもらえますか?
ここにたくさん。ご愛顧いただきありがとうございます。