【发布时间】:2015-05-11 05:36:11
【问题描述】:
我是 MongoDB 和 Mongoose 的新手,我正在尝试使用它来保存股票报价以进行日间交易分析。所以我想象了这个Schema:
symbolSchema = Schema({
name:String,
code:String
});
quoteSchema = Schema({
date:{type:Date, default: now},
open:Number,
high:Number,
low:Number,
close:Number,
volume:Number
});
intradayQuotesSchema = Schema({
id_symbol:{type:Schema.Types.ObjectId, ref:"symbol"},
day:Date,
quotes:[quotesSchema]
});
从我的链接中,我每分钟都会收到这样的信息:
日期 |符号 |开放|高 |低 |关闭 |音量
2015-03-09 13:23:00|AAPL|127,14|127,17|127,12|127,15|19734
我必须:
- 查找符号的 ObjectId (AAPL)。
- 发现此交易品种的intradayQuote 文件是否已经存在(交易品种和日期组合)
- 发现该交易品种的分钟 OHLCV 数据是否存在于报价数组中(因为它可能会重复)
- 更新或创建文档并更新或创建数组内的引号
如果引号已经存在,我可以在不验证的情况下完成此任务,但是此方法可以在引号数组中创建重复条目:
symbol.find({"code":mySymbol}, function(err, stock) {
intradayQuote.findOneAndUpdate({
{ id_symbol:stock[0]._id, day: myDay },
{ $push: { quotes: myQuotes } },
{ upsert: true },
myCallback
});
});
我已经试过了:
- $addToSet 而不是 $push,但不幸的是这似乎不适用于文档数组
- { id_symbol:stock[0]._id, day: myDay, 'quotes["date"]': myDate } 在 findOneAndUpdate 的条件下;但不幸的是,如果 mongo 没有找到它,它会立即创建一个新文档,而不是附加到引号数组中。
有没有一种方法可以在不使用更多查询的情况下完成这项工作(我已经在使用 2 个)?我应该重新考虑我的架构以促进这项工作吗?任何帮助将不胜感激。谢谢!
【问题讨论】:
-
对不起,但这里并不清楚您需要在数组中的现有项目中“更新”什么,以及除“唯一”约束之外的其他字段如何应用于这些更新。否
$addToSet将不起作用,因为“部分不同键”不构成不同对象的“集合”。所以你需要多个查询。在不知道如何应用更新的情况下,实际模式尚不清楚。 -
对不起,如果我的解释令人困惑。我相信这很复杂,甚至不可能。我需要更新日期等于我尝试更新的日期的数组文档项(在 intradayQuote 模型中,其 ObjectId 等于我的符号代码的符号 _id)。如果我能匹配这些条件,我将更新数组中的整个文档(所有键:打开、高......)。如果我不能匹配,我应该在数组中创建一个新文档。如果 intradayQuote 文档也不存在,我应该在创建数组项之前创建它。
-
如果已经有那个不同的“分钟”字段,那么替换整个数组元素对吗?这就是我要问的。我在这里也看不到外部查询的意义。如果您循环任何内容,它似乎是您正在显示的格式的“引号”列表,然后转换为您的模式模式。这就是这段代码真正想要做的吗?为什么嵌入式阵列很重要?因此,您如何实际使用数据,否则会使其成为优势?您的呈现方式没有错,但将任务分解为不同的问题可能会更好地为您服务
-
没错。感谢您的耐心。实际上我不确定我的架构。而且我还不知道我将如何使用这些数据。嵌入数组的要点是:有很多品种,每个品种有大约 540 个每日报价。所以我想每天为每个符号保存一个新文档。每天我通常需要每个交易品种的最后 2 或 3 天的报价来进行主要分析(但我肯定需要长期的历史价格)。所以我打破了不同文件中的每日报价以获得良好的表现。但我是 MongoDB 新手,也许有更好的方法。
标签: javascript node.js mongodb mongoose mongodb-query