2016-08-25 20 views
0

私は以下の2つのフィールドを持つドキュメントの複合キーとして_idフィールドを使用しています。私は私のクエリで一緒に両方のフィールドを使用している場合、私はそれに気づいた何 Mongodb _idフィールドを使用して、1つまたは複数の複合フィールドの一部を照会します。

{ 
    "_id" : { 
     "timestamp" : ISODate("2016-08-25T05:43:00.000-19:30"), 
     "hostName" : "nj" 
    } 

} 

は、私が唯一のクエリにできています。私がそれらの1つを使用する場合、私は返されたドキュメントを取得しません。

db.getCollection('sales').find(
{ 
    "_id" : { 
      "hostName" : "tryme"  
    } 

} 

db.getCollection('sales').find(
{ 
    "_id" : { 
      "timestamp" : ISODate("2016-08-25T05:43:00.000-19:30") 
    } 

} 

上記のスクリプトではドキュメントが返されません。

はまた、私は

db.getCollection('sales').find(
{ 
    "_id" : { 
     "timestamp" : { 
      "$lte":ISODate("2016-08-25T04:51:00.000-19:30") 
     }, 
     "hostName" : "tryme"  
    } 

} 

) 

上記はまた、任意のドキュメントを返さない、日付フィールドに$ GTE/$のLTE演算子を使用することはできませんよ。

以下のクエリは機能しますが、コレクションスキャンを使用するexplain()ごとに表示され、インデックスは使用されません。

db.getCollection('sales').find(
{ 
    "_id.timestamp" : ISODate("2016-08-25T04:51:00.000-19:30"), 
    "_id.hostName" : "tryme"  
} 

) 

== 

db.getCollection('sales').find(
{ 
    "_id.timestamp" : { 
     "$gte": ISODate("2016-08-25T04:52:00.000-19:30") 
    }, 
    "_id.hostName" : "tryme"  
} 

) 

わかりません_idフィールドがどのように正しく動作するかを理解している場合。

基本的には、コンポジットクエリの部分的なフィールドを使用できるようにしたいと同時に、_idフィールドのインデックスを活用しながら、/より大きい/より小さいなどの範囲クエリに対しても日付タイプフィールドを使用したい。

誰か助けてもらえますか?

おかげで、

スリ

答えて

0

the docsより:

MongoDBは埋め込まれた文書のフィールドにアクセスするために、アレイと の要素にアクセスするドット表記を使用します。

ネストされたオブジェクトを等価に一致するクエリとして渡すため、最初の試行は機能しません。代わりにドット表記を使用してください。

+0

ご意見ありがとうございますが、ドットコレクションの結果をコレクションスキャンで使用し、インデックスを使用していません。 mongoシェルの.explain()メソッドでチェックしました。このクエリのインデックスを使いたいと思います。 – user6594900

+0

@ user6594900 falseの場合、ネストされたインデックスを作成できます。https://stackoverflow.com/questions/9730136/how-to-create-a-nested-index-in-mongodb複合インデックスを使用している場合は、そのコンポーネントが動作するためにそのすべてのコンポーネントを照会する必要があります – martriay

関連する問題