原則として難しい質問ですが、2つのドキュメントを提示する単純化されたケースにとどまり、それを基にした解決策を示します。概念は抽象化する必要がありますが、拡張されたケースではより困難です。 集約フレームワーク で可能 一般的に:
db.collection.aggregate([
// Match the documents in a pair
{ "$match": {
"timeMilliSec": { "$in": [ 1414590255, 1414590245 ] }
}}
// Trivial, just keeping an order
{ "$sort": { "timeMilliSec": -1 } },
// Unwind the arrays
{ "$unwind": "$data" },
// Group first and last
{ "$group": {
"_id": "$data.name",
"firstX": { "$first": "$data.x" },
"lastX": { "$last": "$data.x" },
"firstY": { "$first": "$data.y" },
"lastY": { "$last": "$data.y" }
}},
// Difference on the keys
{ "$project": {
"diff": {
"$divide": [
{ "$subtract": [ "$firstX", "$lastX" ] },
{ "$subtract": [ "$firstY", "$lastY" ] }
]
}
}},
// Not sure you want to take it this far
{ "$group": {
"_id": null,
"diffX": {
"$min": {
"$cond": [
{ "$eq": [ "$_id", "X" ] },
"$diff",
false
]
}
},
"diffY": {
"$min": {
"$cond": [
{ "$eq": [ "$_id", "Y" ] },
"$diff",
false
]
}
}
}}
])
意図がわからないため、誇張されている可能性がありますが、サンプルに基づくこれの出力は次のようになります。
{
"_id" : null,
"diffX" : 0.14285714285714285,
"diffY" : 0.6
}
これは計算と一致します。
あなたはあなたのケースに適応することができますが、一般的な原則は示されている通りです。
最後の「パイプライン」段階では、結果を1つのドキュメントに結合するだけなので、少し「極端」になります。それ以外の場合、「X」と「Y」の結果はすでに2つで取得されています。 パイプライン内のドキュメント。主に$group
$first
を使用した操作
および$last
グループ化境界上のそれぞれの要素を見つけるための操作。
$project
での後続の操作
パイプラインステージは、明確な結果を決定するために必要な計算を実行します。 集計演算子
を参照してください 詳細については、特に $divide
>
および$subtract
。
何をするにしても、このコースに従います。 2つのキーで「開始」と「終了」のペアを取得します。次に、計算を実行します。