我不確切知道你的數據是怎麼樣的,但這裏是我的意思。我們假設這是您的數據存儲在數據庫中。
/* 1 */
{
"_id" : ObjectId("59e272e74d8a2fe38b86187d"),
"name" : "data1",
"date" : ISODate("2017-11-07T00:00:00.000Z"),
"number" : 15
}
/* 2 */
{
"_id" : ObjectId("59e272e74d8a2fe38b86187f"),
"name" : "data2",
"date" : ISODate("2017-11-06T00:00:00.000Z"),
"number" : 19
}
/* 3 */
{
"_id" : ObjectId("59e272e74d8a2fe38b861881"),
"name" : "data3",
"date" : ISODate("2017-10-06T00:00:00.000Z"),
"number" : 20
}
/* 4 */
{
"_id" : ObjectId("59e272e74d8a2fe38b861883"),
"name" : "data4",
"date" : ISODate("2017-10-05T00:00:00.000Z"),
"number" : 65
}
我知道你想在一個月甚至幾年內比較一些數值。所以,你可以做以下
db.getCollection('test').aggregate([
{
$match: {
// query on the fields with index
date: {$gte: ISODate("2017-10-05 00:00:00.000Z"),
$lte: ISODate("2017-11-07 00:00:00.000Z")}
}
},
{
// retrieve the month from each document
$project: {
_id: 1,
name: 1,
date: 1,
number: 1,
month: {$month: "$date"}
}
},
{
// group them by month and perform some accumulator operation
$group: {
_id: "$month",
name: {$addToSet: "$name"},
dateFrom: {$min: "$date"},
dateTo: {$max: "$date"},
number: {$sum: "$number"}
}
}
])
我建議你保存前彙總數據,通過這種方式,而不是通過每月30份文件,例如你只需要搜索每月1次搜索。如果你有預先彙總的結果存儲,那麼你只需要彙總完整的數據一次,那麼你只需要運行新的數據進入前聚合。
這可能是東西你在找什麼?
此外,如果你有索引,他們的字段,你查詢有索引,那麼這也有幫助。否則,MongoDB必須掃描集合中的每個文檔。
你們是否在你查詢的字段上使用索引? –
是的,我們做@AlexP。 – nn3112337
您可以使用聚合框架每月彙總數據。所以如果你想查詢完整的時間範圍,你的數據是預先聚合的,你不會失去任何東西。 –