2017-07-14 8 views
0

私はこのスキーマでのエントリーがあり、コレクションがあります。クエリは、アレイ入力に合わせて

[ { name: 'Age', value: '596066467e492a9b1944a988' }, 
{ name: 'Gender', value: '595dc5e856207969bd4a2081' } ] 

私は数字にしようとしている:私もこの配列を生成し、フォームを持っている

{ 
    "_id" : "5966edbfca08e4e92c6484f0", 
    "comment" : "....", 
    "demographics" : [ 
     "596066467e492a9b1944a988" 
    ], 
} 

をフォームの配列結果の "値"が "人口統計" mongoエントリの配列にあるコレクション内の一致の配列を返すMongoDBクエリを出力します。一致するものが複数ある場合は、「または」と一致するはずです。

答えて

1

"demographics"フィールドは純粋に「ObjectIdの配列」または少なくとも類似して構成されたデータであるため、実際に入力する必要があるのは入力を単純に値の配列に一致させて一致させることです。

オペレータ$inは、基本的には、単一フィールドに適用される$orの略記形式です。そのため、指定されたフィールドとの照合のためには引数として値の配列が必要となります。また、MongoDBは、クエリフォーム内の等価マッチングに関して、「配列」または「特異プロパティ」を区別しません。

しかし、単純な値への基本的な転換、単に.map()

var input = [ 
    { name: 'Age', value: '596066467e492a9b1944a988' }, 
    { name: 'Gender', value: '595dc5e856207969bd4a2081' } 
]; 

var query = { 
    "demographics": { 
    "$in": input.map(i => ObjectId(i.value)) 
    } 
}; 

collection.find(query) 

の使用量は、あなたの実際のデータがObjectId形式ではなく、「文字列」であるもちろん仮定しますが、より実際の「フォーム入力」が必要ですHTTPリクエストは常に「文字列」として表示され、タイプが異なる場所に一致させるために正しいタイプにキャストする必要があります。

mongooseなどのライブラリの中には、実際に値がObjectIdであることを前提に「キャスト」するか、データの「スキーマ」で定義されたアプリケーションを検査するものがありますマングース自体と。このような場合は、クエリが発行されたときに自動的に行われるため、データを自分自身でキャストする必要はありません。

ここでの結果は、ドキュメント内の"demographics"プロパティの "any"値と、指定された値の "any"が一致したドキュメントです。

+0

ありがとうございます! – NickL

関連する問題