集約フレームワーク
.distinct()
ではありません コマンド:
db.event.aggregate([
// De-normalize the array content to separate documents
{ "$unwind": "$tags" },
// Filter the de-normalized content to remove non-matches
{ "$match": { "tags": /foo/ } },
// Group the "like" terms as the "key"
{ "$group": {
"_id": "$tags"
}}
])
正規表現の先頭に「アンカー」を使用する方がおそらく良いでしょう。つまり、文字列の「先頭」からです。また、これを行う $match
$unwind
を処理する前に
同様に:
db.event.aggregate([
// Match the possible documents. Always the best approach
{ "$match": { "tags": /^foo/ } },
// De-normalize the array content to separate documents
{ "$unwind": "$tags" },
// Now "filter" the content to actual matches
{ "$match": { "tags": /^foo/ } },
// Group the "like" terms as the "key"
{ "$group": {
"_id": "$tags"
}}
])
これにより、 $unwind
を処理していないことが確認されます。
コレクション内のすべてのドキュメントと、「フィルタリング」して確認する前に「一致したタグ」の値が含まれている可能性のあるドキュメントのみ。
一致する可能性のある大きなアレイをいくらか軽減するための本当に「複雑な」方法は、もう少し作業が必要であり、MongoDB 2.6以降:
db.event.aggregate([
{ "$match": { "tags": /^foo/ } },
{ "$project": {
"tags": { "$setDifference": [
{ "$map": {
"input": "$tags",
"as": "el",
"in": { "$cond": [
{ "$eq": [
{ "$substr": [ "$$el", 0, 3 ] },
"foo"
]},
"$$el",
false
]}
}},
[false]
]}
}},
{ "$unwind": "$tags" },
{ "$group": { "_id": "$tags" }}
])
したがって、 $map
はアレイの優れた「インライン」プロセッサですが、これまでのところしか実行できません。 $setDifference
演算子はfalse
を否定します 一致しますが、最終的には$unwind
を処理する必要があります 残りの$group
を実行します 全体として明確な価値観のステージ。
ここでの利点は、配列が一致する「タグ」要素のみに「縮小」されることです。同じドキュメントに「複数の異なる」値がある場合に発生の「カウント」が必要な場合は、これを使用しないでください。しかし、繰り返しになりますが、それを処理する方法は他にもあります。