我的mongoDB中的每个条目都是这样的形式
{"_id" : date,
"tickers" = [{"ticker": ticker, "open": open, "close":close}]
其中整个集合是一年的数据。我正在尝试按天分组,然后每天将收盘价设为最高。以下是我的最佳尝试,但似乎无法正常工作。
db.stocks.aggregate([
{$unwind: '$tickers'},
{"$sort": {"_id": 1, "tickers.open": -1}},
{"$group": {
"_id": "_id",
"ticker": { "$first": "$tickers.ticker"},
"open": { "$first": "$tickers.open" },
"close": { "$first": "$tickers.close" }
}}
])
下面是数据库中252的示例记录
{
"_id" : "19990726",
"tickers" : [
{
"ticker" : "luk",
"close" : 5.96998,
"open" : 6.07182
},
{
"ticker" : "cce",
"close" : 15.0793,
"open" : 15.2627
},
{
"ticker" : "bac",
"close" : 22.4244,
"open" : 21.9815
},
{
"ticker" : "cci",
"close" : 24.5,
"open" : 24.19
},
{
"ticker" : "kss",
"close" : 35.7964,
"open" : 36.3512
},
{
"ticker" : "luv",
"close" : 13.0781,
"open" : 13.2789
},
{
"ticker" : "mwv",
"close" : 16.5388,
"open" : 17.0901
}
]
}
当我运行查询时,我只会得到返回
{ "_id" : "_id", "ticker" : "aig", "open" : 812.485, "close" : 829.651 }
当我应该为每个“ _id”取回一条记录时,再从“ tickers”子数组中获得一条记录,其中该记录包含最大开盘价的记录。
当我尝试修改现在可以使用的查询时,我搞砸了嵌套计算的语法,以计算日变化量而不是最大值。有人可以帮我正确嵌套它们吗?
db.stocks.aggregate([
{$unwind: '$tickers'},
{"$sort": {"_id": 1, {$abs: { 1 - $divide: [ "$tickers.close", "$tickers.open" ] }}: -1}},
{"$group": {
"_id": "$_id",
"ticker": { "$first": "$tickers.ticker"},
"open": { "$first": "$tickers.open" },
"close": { "$first": "$tickers.close" }
}}
]);
答案 0 :(得分:0)
我认为您的错误可能与您使用的_id
有关。您会看到一个expression,它指示您将用于分组的字段。
字段路径和系统变量:聚合表达式使用字段路径来访问输入文档中的字段。要指定字段路径, 使用以美元符号$开头的字符串,即字段名称或 点分隔的字段名称(如果该字段位于嵌入式文档中)。例如, “ $ user”指定用户字段或“ $ user.name”的字段路径 指定“ user.name”字段的字段路径。
“ $”等效于“ $$ CURRENT”。电流是 系统变量,默认为的当前对象的根 大多数阶段,除非在特定阶段另有说明。当前可以 反弹。
我要使您的查询生效,您需要使用$
进行引用,例如$_id
。
db.stocks.aggregate([
{$unwind: '$tickers'},
{"$sort": {"_id": 1, "tickers.open": -1}},
{"$group": {
"_id": "$_id",
"ticker": { "$first": "$tickers.ticker"},
"open": { "$first": "$tickers.open" },
"close": { "$first": "$tickers.close" }
}}
]);
您可以在documentation中看到$group _id
的示例。