2011-07-02 47 views
6

それぞれにサブドキュメントの配列が含まれているドキュメントのコレクションがあります。各サブ文書には時間値があります。サブ文書の時刻に基づいてサブ文書を返すことができるかどうかを確認しようとしています。配列内の値で配列値を1つ取り出すMongoDBクエリ

私は$ sliceを使ってサブ文書を取り出すことができますが、$ sliceは特定のインデックスまたは範囲とオフセットを与えます。

例時間!

ドキュメント私が見つけると、クエリを行う場合はそう....

{ 
    id: 1234, 
    type: 'a', 
    subs: [ 
     { time: 123001, val: 'a' }, 
     { time: 123002, val: 'b' }, 
     { time: 123003, val: 'c' } 
    ] 
} 

は似ています({}、{潜水艦:{$スライス:[2,1]}})私はバックのような何かを得ます:

{ id: 1234, type: 'a', subs: [{ time: 123002, val: 'b' }]} 

たとえば、オフセットではなく123002の時間値に基づいて、そのレコードを取得したいと考えています。

可能ですか?

go!

答えて

4

データを設計したので、これは不可能です。

MongoDBでは、クエリはドキュメント全体を返します。特定のフィールドをフィルタリングすることはできますが、フィールドの値が配列の場合はそのフィールドで停止します。

「オブジェクトの配列」がある場合は、$sliceにする必要があります。そうでない場合や、データを別の方法でモデル化する必要があります。あなたのケースでは

、次のような構造では、あなたのクエリが可能になります:私は、JSONオブジェクトの代わりに、配列にsubsを変更したか

{ 
    _id: 1234, 
    type: 'a', 
    subs: { 
     '123001': { val: 'a' }, 
     '123002': { val: 'b' }, 
     '123003': { val: 'c' } 
    } 
} 

は注意してください。今、あなたは、次のクエリを実行し、あなたが探しているだけの時間を取得することができます:

find({ _id: 1234 }, { 'subs.123002': 1 }) 

ここでは明らかにトレードオフは、あなたがドキュメントを変更する使用方法を変更する必要がありますということです。 $pushsubsに使用することはできません。{'subs.time': 1234}を照会することはできず、代わりに{'subs.1234': { $exists:true} }を照会する必要があります。

+0

Oh duhh!それはうまくいく。ありがとうございました。あなたが言っていることを誤解していない限り、ドキュメントの一部を返すことができます。http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fieldsスライスを使用しない配列の一部ではない。ありがとう! – FredArters

+0

元の構造体を使用している場合は、 'subs.2 'を使って配列の3番目の要素を取得できます。しかし、一般的に、第3の項目が本当に何であるかは分かりません。配列の場合は、一般的にはすべてまたは何もありません。 –

+1

質問は古いですが、これは回答を探している人にとって便利なことかもしれません。配列内の1つのドキュメントを$ elemMatchと照合することは可能です。 http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29#DotNotation%28ReachingintoObjects%29-Matchingwith%24elemMatch – Esteban

関連する問題