アグリゲーションフレームワークとカーソル反復の助けを借りて、簡単にドキュメントを変換することができます。
例:
db.collection.aggregate([
{$project:
{
value:1,
"threshold":{$let:
{
vars: {threshold: 80 },
in: "$$threshold"
}}
}
},
{$match:{value:{$ne: "$threshold"}}},
{$group:
{
_id:"$null",
low:{
$max:{
$cond:[{$lt:["$value","$threshold"]},"$value",-1]
}
},
high:{
$min:{
// 10000000000 is a superficial value.
// need something greater than values in documents
$cond:[{$gt:["$value","$threshold"]},"$value",10000000000]
}
},
threshold:{$first:"$threshold"}
}
}
])
集約フレームワークは、2つの値を使用して文書を返します。
{
"_id" : null,
"low" : NumberInt(75),
"high" : NumberInt(81),
"threshold" : NumberInt(80)
}
返品基準に一致する文書を簡単に見つけることができます。例えばNodeJSでは簡単にこれを行うことができます。変数を仮定すると、result
は集約クエリの結果を保持します。あなたが言及したよう
result.forEach(function(r){
var documents = [];
db.collection.find({$or:[{"value": r.low},{"value": r.high}]}).forEach(function(doc){
var _doc = {};
_doc.time = doc.time;
_doc.result = doc.value < r.threshold ? "enter" : "exit";
documents.push(_doc);
});
printjson(documents);
});
、あなたの入力ドキュメントが出力されます
{ 'time' : '2016-03-28 12:12:00', 'value' : 90 },
{ 'time' : '2016-03-28 12:13:00', 'value' : 82 },
{ 'time' : '2016-03-28 12:14:00', 'value' : 75 },
{ 'time' : '2016-03-28 12:15:00', 'value' : 72 },
{ 'time' : '2016-03-28 12:16:00', 'value' : 81 },
{ 'time' : '2016-03-28 12:17:00', 'value' : 90 },
etc....
クエリ溶液中の上記(サンプル)している場合:の
{
"time" : "2016-03-28 12:14:00",
"result" : "enter"
},
{
"time" : "2016-03-28 12:16:00",
"result" : "exit"
}
可能性のある重複した[ベースの最大連続レコードの数を探しますMongodbクエリの1つのフィールド](http://stackoverflow.com/questions/21621754/find-count-of-maximum-consecutive-records-based-on-one-field-in-mongodb-query)? –
"dup"(まだ)として投票していません。あなたのケースが少し不明であるからです。逐次反復はあなたが本当に欲しいものです。ここで示したように結果を吐き出すためにmapReduceを「強制」することができますが、実際に何かを得ていない限り、そうしないでください。アグリゲーションフレームワークは、ここで必要なようにドキュメント間を単に追跡することはできません。 –
'time'フィールドに重複がありますか? 'value'が80の場合、' result'は何になりますか? –