ようにMongoDB 3.4でこれをで行うための最善の方法を見てしまう。この
db.yourColl.aggregate([
{
$project: {
words: { $split: ["$foo", " "] }
}
},
{
$unwind: {
path: "$words"
}
},
{
$group: {
_id: "$words",
count: { $sum: 1 }
}
}
])
結果のようなパイプラインを作成することができる場所にそれと
前述のように配列の配列にhereと$unwind
パイプラインで配列をダウンする必要があるので、最大効率のために$facet
演算子を使ってサブパイプラインでこれを行う必要があります。生成
db.collection.aggregate([
{ "$facet": {
"results": [
{ "$project": {
"values": { "$split": [ "$foo", " " ] }
}},
{ "$unwind": "$values" },
{ "$group": {
"_id": "$values",
"count": { "$sum": 1 }
}}
]
}}
])
:後方のMongoDB 3.2から
{
"results" : [
{
"_id" : "boo",
"count" : 2
},
{
"_id" : "baz",
"count" : 3
},
{
"_id" : "bar",
"count" : 2
}
]
}
は、これを行うための唯一の方法は、mapReduce
です。
返し
var reduceFunction = function(key, value) {
var results = {};
for (var items of Array.concat(value)) {
for (var item of items) {
results[item] = results[item] ? results[item] + 1 : 1;
}
};
return results;
}
db.collection.mapReduce(
function() { emit(null, this.foo.split(" ")); },
reduceFunction,
{ "out": { "inline": 1 } }
)
:
{
"results" : [
{
"_id" : null,
"value" : {
"bar" : 2,
"baz" : 3,
"boo" : 2
}
}
],
"timeMillis" : 30,
"counts" : {
"input" : 3,
"emit" : 3,
"reduce" : 1,
"output" : 1
},
"ok" : 1
}
をあなたのMongoDBのバージョンがfor...of
文をサポートしていない場合機能を減らすに.forEach()
方法を使用することを検討すべきです。
それは文字通り完璧に見える、ありがとう。私はできるだけ早くそれをテストに入れ、期待通りに動作するかどうか受け入れボタンを押します。 – user1381745
ちょうどバージョン3.3.10とそれをテストして働いた:) – DAXaholic
@DAXaholicどのように私は同じ問題を処理できますか?カンマのような他の区切り文字を含む記事ですか?ありがとう – galgo