失去了试图找出正确的查询

时间:2014-03-08 21:45:56

标签: mongodb

选择当天的所有不同和最后(按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

1 个答案:

答案 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/的作业问题吗?因为它看起来很熟悉。