选择当天的所有不同和最后(按saved_date)的股票代码('t'),并按cp_fix值订购(desc)。
这是一条记录:
{
"_id" : ObjectId("53149f620c2c3735567a3272"),
"c" : "-1.03",
"ccol" : "chr",
"e" : "NASDAQ",
"ltt" : "10:27AM EST",
"cp_fix" : "-1.61",
"c_fix" : "-1.03",
"l" : "63.05",
"s" : "0",
"lt" : "Mar 3, 10:27AM EST",
"t" : "ABCO",
"l_fix" : "63.05",
"cp" : "-1.61",
"id" : "667046",
"saved_date" : ISODate("2014-03-03T19:55:53.454Z"),
"l_cur" : "63.05"
}
我甚至不知道从哪里开始,因为我认为应该使用'distinct'子句,但它似乎不能与其他条款结合使用。我考虑过聚合操作,但我没有看到任何需要聚合的内容。
编辑:我一直在SO和Google上阅读一些类似的问题,我有以下问题:
var yesterday = new Date();
var today = new Date();
yesterday.setDate(today.getDate() -1)
db.stock_history.aggregate([
{$sort: {"saved_date": -1}},
{$project: {"t":1 }},
{$group: {"_id": "$t"}},
{{$match: { saved_date: { $gte: yesterday, $lt: today}}}
{$limit:20}
])
我真的不知道查询是否正确,因为当我尝试运行它时出现以下错误:
Error: Printing Stack Trace
at printStackTrace (src/mongo/shell/utils.js:37:7)
at DBCollection.aggregate (src/mongo/shell/collection.js:897:1)
at (shell):1:18
Sat Mar 8 20:05:39.102 JavaScript execution failed: aggregate failed: {
"errmsg" : "exception: terminating request: request heap use exceeded 10% of physical RAM",
"code" : 15944,
"ok" : 0
} at src/mongo/shell/collection.js:L898
答案 0 :(得分:0)
您显然拥有大型数据集并且遇到内存问题,但还有其他一些原因导致此问题。请参阅查询:
db.stock_history.aggregate([
{"$match": { "saved_date": { "$gte": yesterday, "$lt": today }}}
{"$sort": { "t": 1, "saved_date": 1 }},
{"$group": {
"_id": "$t",
"cp_fix": {"$last": "$cp_fix"}
"saved_date": {"$last": "$saved_date"}
}},
{"$sort": {"cp_fix": -1}},
{"$limit":20}
])
对于大数据,您要做的第一件事就是$ match。这将减少通过其他管道阶段的内容,也是您使用索引进行选择的唯一机会。在做任何其他工作之前,请将其视为.find()
。
按“t”和“saved_date”对结果进行排序,使它们按顺序排列
分组。该边界处“t”和最后值的不同值
最后按“cp_fix”值
您的内存问题可能是因为您需要先使用 $ match 来减少设置。
这是来自https://education.mongodb.com/的作业问题吗?因为它看起来很熟悉。