ここでのデータ構造は適切な実装ではありません。これがどのように構造化されているかについては多くの問題があり、集計にはまったく適していません。ここでの主な問題は次のとおりです。
-
構造体は実際には配列を使用していませんが、現時点では使用していません
-
特定のキー名はすべて実際の問題を引き起こし、これは回避できます。
そのため、この種の構造をトラバースする唯一の方法は、mapReduceでJavaScriptを使用することです。
マッパーの定義:
var mapper = function () {
for ( var n in this.versions ) {
for ( var k in this.versions[n].content ) {
if (
( k != 'confirmed' ) ||
( k != 'visited' ) )
emit(
{
type: this.chairtype,
key: k
},
this.versions[n].content[k]
);
}
}
};
つまり、これが行っているのは、各バージョンエントリを循環し、次にコンテンツのすべてを循環することです。キーは、「chairtype」キーだけでなく、必要なコンテンツキーごとに発行されます。そして、その値はその一致する値です。
そしてレデューサー:
var reducer = function (key,values) {
return ( Array.sum( values ) != 0 )
? Array.sum( values ) / values.length : 0;
};
これは、同じキーを使用してマッパーに入力されるすべての値から平均を生成する簡単な方法です。
したがって、これはうまく機能するはずですが、実行する必要があるのは構造を変更することです。したがって、実際には、次のようなものがあった場合:
{
"_id": ObjectId("52b85dfa32b6249513f15897"),
"parent": "47de3176-bbc3-44e0-8063-8920ac56fdc8",
"type": "chair",
"chairtype": "E",
"content": [
{ "key": "atkswlntfd", "value": 0, "version": 0 },
{ "key": "auwbsjqzir", "value": 0, "version": 0 },
{ "key": "avqrnjzbgd", "value": 0, "version": 0 }
]
}
または、一般的にその形式では、集計操作は非常に簡単になります。
db.collection.aggregate([
{ "$unwind": "$content" },
{ "$group": {
"_id": {
"chairtype": "$chairtype",
"key": "$content.key"
},
"average": { "$avg": "$content.value" }
}}
])
または、これの他のバリエーションが必要ですが、構造を変更することで可能になりました。
したがって、ドキュメントの構造が異なる場合は、mapReduceを使用してこれを行う必要があります。