問題タブ [subdocument]

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.

0 投票する
1 に答える
449 参照

mongodb - セイルとサブドキュメント ObjectId()

基本的に次のような既存のMongoDBコレクションがあります。

ご覧のとおり、サブドキュメントでオブジェクト ID を使用して、このデータを、数値に関する追加情報を保存する外部コレクションに関連付けています。これらの ID はすべて、それを自動的に行う他のアプリで Mongoose によって自動的に生成されました。

現在、ウォーターラインでは、サブドキュメントのスキーマ サポートがないため、コレクションで find() を実行すると、サブドキュメントの ObjectId が ID 文字列ではなく JSON として返されます。

この結果、次のような結果になります

Mongoose はこれを適切に処理し、クライアント側で関連するクエリを実行するために常にこれらの ID を使用できますが、Waterline ではネストされたスキーマがないため、これは別の行き止まりのようです。

コレクションを返す前にコレクション全体をループしたり、データベースを移行したり、ドキュメントを変更したり、データベースを完全に正規化したりすることなく、これを解決する方法はありますか? このデータは複数のアプリからアクセスされるため、そのままにしておく必要があります。

0 投票する
1 に答える
894 参照

arrays - How can I omit elements from arrays inside nested documents with mongo?

I have the following structure for a collection in MongoDB

and I am trying to implement projection in my API: for example, if the user requests

The result should be

Since the 'fields' names are not actual keys, I cannot use mongo projection, say

db.collection.find({},{_id: 1, tags: 1, fields.'common field 1': 1})

So I must instead search within the array for the fields whose "name" property matches my projection parameter. I achieved that for the first level array with aggregation and $redact, as suggested in this answer https://stackoverflow.com/a/24032549/5418731

However, I cannot use $redact to select subfields from the inner arrays in multivalued fields. The $or parameters would have to be something like

[{ $not : "$name" }, { $eq: ["$name", "common field 1"] }, { $eq: ["$name", "subfield1"] }]

which means a first level field with the same name of the subfield specified would also pass.

After upgrading MongoDB to 3.2, I attempted the $filter solution in this answer https://stackoverflow.com/a/12241930/5418731, which also works fine for the first level array:

but I couldn't find a way to use it "nested" and filter the second level array items. Adding {$eq: ['$$field.value.name', 'subfield1']} doesn't work.

Last, I tried the $map solution presented here https://stackoverflow.com/a/24156418/5418731:

But this one won't work because the "value" property of each "fields" item is not necessarily an array, and when it isn't the whole query fails.

I'm about to give up and mask the results in JS. Is there a good solution for that with Mongo?

0 投票する
2 に答える
1216 参照

node.js - MongoDB でサブドキュメントを更新するにはどうすればよいですか?

サブドキュメントを更新するために Mongoose で作成されたコードが機能しませんでした。そこで、Mongo Shell 内でサブドキュメントを更新しようとしました。
これはドキュメント (場所) とサブドキュメント (レビュー) です。

}

サブドキュメントを更新する私の試みのいくつかを次に示します。
この質問は次の形式を与えました。

これにより、次のように「更新が定義されていません」というエラーが返されました。

コマンドが db.locations.update() で始まらなかったためだと思います

MongoDB のドキュメントでは、次の形式を使用しました。

これは有効な更新を返しますが、示されているように更新は実際には行われませんでした:

この質問では、次の形式を使用しました。

これは、次に示すように、MongoDB ドキュメントと同じものを返します。

したがって、これらのクエリは機能していると思いますが、データが更新されていません。私のデータはおそらく間違ってインデックス付けされますか? 実際の場所は、Mongoose API でも更新できます。

0 投票する
1 に答える
303 参照

javascript - Mongoose サブドキュメント - ID が見つかりません

大量の console.logs を使用して、これが機能しない理由を突き止めようと数時間を費やしましたが、ここで基本的なものが欠落しています。

シナリオは、Getting MEAN に関する Simon Holmes の本 (第 6 章) からのものです。関数全体をコピーして申し訳ありませんが、明らかな何かが欠けていないことを確認したかったのです。

次のように定義されたスキーマがあります。

特定のレビューで単一の場所を読み取るためのコード:

Google Postman を使用して、API に対してクエリを実行します。

しかし、私は

ここで私を混乱させているのは、私が正しいレビュー サブドキュメント ID を参照していると信じているが、これを示す JSON を欲しがっていないことです。Javascript はそれを認識せず、マングース関数がそれを返さない理由を説明している可能性があります。

これは私のトレースです:

ご覧のとおり、場所ドキュメントとレビュー サブドキュメントが見つかり、最初のアイテムの評価値を出力することさえ可能です。ただし、JSON ペイロードに値があると表示されているにもかかわらず、ID は null です。

ここで私が間違っていることはありますか?

いつものように、助けていただければ幸いです。

ジョン

0 投票する
1 に答える
154 参照

mongodb - クエリの構文に基づいて使用されていないサブドキュメントの MongoDB インデックス

次のようなドキュメントのコレクションで、MongoDB で Meteor を使用しています。

最初に次のようなインデックスを作成しました。 collection._ensureIndex({'c.d': 1});

そして、次のようなクエリを実行しました: collection.find({c: {d: 'd1'}). これらは非常にゆっくりと実行され、explain() でデバッグしたときに、インデックスを使用していないことに気付きました。

OTOH、次のようなクエリを実行した場合: collection.find({'c.d': 'd1'})、Mongoインデックスを使用します。

サブドキュメント全体にインデックスを付けるようにインデックスを変更しました。つまりcollection._ensureIndex({c: 1})、最初のクエリがインデックスにヒットするようになりました。

私の質問は、これはバグですか、それとも機能ですか? 私の印象では、JSON では 2 つの表記法は同等であり、率直に言って、データベースは 2 つのクエリ用語が同じフィールドを参照していることを認識し、適切なインデックスを使用するほどスマートであることが期待されます。

サブドキュメント全体をインデックス化する回避策に関する私の懸念は、最終的に、そのサブドキュメントには、インデックス化する必要のないフィールドがさらに含まれる可能性があり、不要なインデックス用語を保持する時間と RAM を浪費するのは最適ではないように思われることです。

これがバグでない場合、Mongo にネストされたオブジェクトの構文を認識させ、インデックスを適切に使用させる方法はありますか?