我是mongodb的新手,现在我在这个任务上被困了一段时间。我需要使用以下模式对集合执行查询:
{
ticker: String,
asks: [[Number]],
bids: [[Number]],
timestamp: String,
datetime: String
}以下是文档示例:
{
"_id" : ObjectId("5fc17630cf8dff0cd5506dc4"),
"asks" : [
[ "23685.0", "0.008" ],
[ "23688.8", "0.000" ],
[ "23696.7", "0.000" ]
],
"bids" : [
[ "23553.7", "0.200" ],
[ "23557.8", "0.207" ],
[ "23558.4", "0.045" ],
[ "23563.4", "0.020" ]
],
"timestamp" : 1606514176211,
"datetime" : "2020-11-27T21:56:16.211Z",
"ticker" : "YFI/USDT"
}招投标的内部数组有两个要素:第一要素是价格,第二要素是数量。
我有两个问题:
任何帮助都是非常感谢的。谢谢。
发布于 2020-12-03 06:34:32
问题1:
您必须首先$match您的日期,以返回您需要的时间间隔内的文件,然后$filter您的数组(询问或出价),以返回您需要的。
下面是一个查询(当然,对于投标您也可以这样做):
db.collection.aggregate([
{
"$match": {
$expr: {
"$and": [
{
"$gte": [
"$datetime",
"2020-11-01"
]
},
{
"$lt": [
"$datetime",
"2020-12-01"
]
}
]
}
}
},
{
"$addFields": {
"asks": {
"$filter": {
"input": "$asks",
"as": "ask",
"cond": {
"$gte": [
{
"$toDouble": {
"$arrayElemAt": [
"$$ask",
0
]
}
},
23686
]
}
}
}
}
}
])问题2:
但是,正如您注意到的,它可能不是存储和查询数据的最佳方法。我认为有一些简单的事情需要改进:
1-用对象替换嵌套数组。直接查询对象字段比查询数组中的位置更容易。
{
"price" : yourPrice,
"quantity":yourQuantity
}2-使用数字(int/double)代替字符串,您将避免转换步骤,从而提高聚合的性能。
{
"price" : 21563,
"quantity":0.154
}你真的需要日期和时间吗?如果没有,只需存储日期,这样您就可以将索引放在上面,并在$match阶段从中获益。
https://stackoverflow.com/questions/65118801
复制相似问题