首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组查询

数组查询
EN

Stack Overflow用户
提问于 2020-12-03 01:58:51
回答 1查看 169关注 0票数 0

我是mongodb的新手,现在我在这个任务上被困了一段时间。我需要使用以下模式对集合执行查询:

代码语言:javascript
复制
{
  ticker: String,
  asks: [[Number]],
  bids: [[Number]],
  timestamp: String,
  datetime: String
}

以下是文档示例:

代码语言:javascript
复制
  { 
    "_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"
  }

招投标的内部数组有两个要素:第一要素是价格,第二要素是数量。

我有两个问题:

  1. 我需要查询的集合,以获得所有的条目,其中的价格大于一个值,在两个请求和出价(仅要求或仅出价)的时间间隔,基于日期时间字段。我试图处理$elemMatch和聚合框架,但到目前为止没有什么进展。
  2. 另一个问题是,在查询这些字段时,数组还是数组字段类型是一个很好的选择。我希望有数百万这样的记录。请建议是否添加索引和/或使用其他数据结构在集合中保存此数据。

任何帮助都是非常感谢的。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-03 06:34:32

问题1:

您必须首先$match您的日期,以返回您需要的时间间隔内的文件,然后$filter您的数组(询问或出价),以返回您需要的。

下面是一个查询(当然,对于投标您也可以这样做):

代码语言:javascript
复制
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-用对象替换嵌套数组。直接查询对象字段比查询数组中的位置更容易。

代码语言:javascript
复制
{
  "price" : yourPrice, 
  "quantity":yourQuantity
}

2-使用数字(int/double)代替字符串,您将避免转换步骤,从而提高聚合的性能。

代码语言:javascript
复制
{
  "price" : 21563, 
  "quantity":0.154
}

你真的需要日期和时间吗?如果没有,只需存储日期,这样您就可以将索引放在上面,并在$match阶段从中获益。

下面是这样一个数据集/查询的示例

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65118801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档