20

「users」というコレクションに次のドキュメント スキーマがあるとします。

{
    name: 'John',
    items: [ {}, {}, {}, ... ]
}

'items' 配列には、次の形式のオブジェクトが含まれます。

{
    item_id: "1234",
    name: "some item"
}

各ユーザーは、'items' 配列に複数のアイテムを埋め込むことができます。

ここで、特定のユーザーの item_id でアイテムを取得できるようにしたいと考えています。

たとえば、「John」という名前のユーザーに属する ID「1234」のアイテムを取得したいとします。

mongoDBでこれを行うことはできますか? その強力な配列インデックスを利用したいのですが、埋め込まれた配列に対してクエリを実行し、それを含むドキュメントではなく配列からオブジェクトを返すことができるかどうかはわかりません。

{users.items.item_id: "1234"} を使用して、特定のアイテムを持っているユーザーを取得できることを知っています。しかし、ユーザーではなく、配列から実際のアイテムを取得したいと考えています。

または、このデータを整理して、必要なものを簡単に取得できるようにするためのより良い方法はありますか? 私はまだmongodbにかなり慣れていません。

あなたが提供できる助けやアドバイスをありがとう。

4

3 に答える 3

33

質問は古いですが、当時から対応が変わっています。MongoDB >= 2.2 では、次のことができます。

db.users.find( { name: "John"}, { items: { $elemMatch: { item_id: "1234" } } })

あなたが持っているでしょう:

{
   name: "John",
   items: 
   [ 
       {
         item_id: "1234",
         name: "some item"
       }
   ]
}

$elemMatch のドキュメントを参照してください

于 2014-04-12T12:33:00.927 に答える
7

これについて注意すべきことがいくつかあります。

1)MongoDBを学ぶ人々にとって最も難しいのは、彼らが慣れ親しんでいるリレーショナル思考を国連で学ぶことだと思います。あなたのデータモデルは正しいもののようです。

2)通常、MongoDBで行うことは、ドキュメント全体をクライアントプログラムに返し、クライアントプログラミング言語を使用してクライアント側で必要なドキュメントの部分を検索することです。

この例では、「user」ドキュメント全体をフェッチしてから、クライアント側の「items[]」配列を反復処理します。

3)「items []」配列のみを返したい場合は、「フィールド選択」構文を使用して返すことができます。詳細については、 http://www.mongodb.org/display/DOCS/Querying#Querying-FieldSelectionを参照してください。残念ながら、配列の1つの要素だけでなく、'items[]'配列全体が返されます。

4)この機能を追加するための既存のJiraチケットがあります:https : //jira.mongodb.org/browse/SERVER-828SERVER-828です。最新の2.1(開発)ブランチに追加されたようです。つまり、リリース2.2が出荷されたときに本番環境で使用できるようになります。

于 2012-06-22T22:11:39.163 に答える
1

これが埋め込み配列の場合、その要素を直接取得することはできません。取得されたドキュメントはユーザー(ルートドキュメント)の形式になりますが、すべてのフィールドに入力されるとは限りません(クエリによって異なります)。

その要素だけを取得する場合は、別のドキュメントとして別のコレクションに保存する必要があります。追加のフィールドが1つありますuser_id(の一部にすることができます_id)。次に、やりたいことをするのは簡単です。

サンプルドキュメントは次のようになります。

{
    _id: {user_id: ObjectId, item_id: "1234"},
    name: "some item"
}

この構造により、item_idユーザーごとの一意性が保証されることに注意してください(これが必要かどうかはわかりません)。

于 2012-06-22T16:06:01.157 に答える