あなたはほとんど自分のタグでこれに答えました。 MongoDBには$regex
があります 正規表現をクエリとして送信できるようにする演算子。したがって、「Alex」を含む文字列をクエリするには、次のようにします。
Books.find(
{ "authors": { "$regex": "Alex", "$options": "i" } },
function(err,docs) {
}
);
これを行うこともできます:
Books.find(
{ "authors": /Alex/i },
function(err,docs) {
}
);
どちらも有効であり、ドキュメントに示されているサポートされている正しい構文で試した方法とは異なります。
しかしもちろん、実際に「文字列のどこかで「Alex」に一致するものに対してのみ「配列」の結果を取得する方法」を尋ねている場合はどうでしょうか。それならこれは少し違います。
1つ以上の複雑なマッチング 配列要素は、配列コンテンツを「フィルタリング」する必要がある集約フレームワーク(または、場合によってはmapReduceですが、はるかに低速です)のドメインです。
あなたはほとんど同じことから始めます。ここで重要なのは、 $unwind
です。 個々のドキュメントとして適切に「フィルタリング」できるように、配列の内容を「非正規化」します。次に、「一致する」ドキュメントを使用してアレイを再構築します。
Books.aggregate(
[
// Match first to reduce documents to those where the array contains the match
{ "$match": {
"authors": { "$regex": "Alex", "$options": i }
}},
// Unwind to "de-normalize" the document per array element
{ "$unwind": "$authors" },
// Now filter those document for the elements that match
{ "$match": {
"authors": { "$regex": "Alex", "$options": i }
}},
// Group back as an array with only the matching elements
{ "$group": {
"_id": "$_id",
"title": { "$first": "$title" },
"authors": { "$push": "$authors" },
"subjects": { "$first": "$subjects" }
}}
],
function(err,results) {
}
)