在MongoDB中,如何搜索保存为数组的子文档?我只需要与条件匹配的数组对象

icnyk63a  于 2022-11-22  发布在  Go
关注(0)|答案(1)|浏览(117)

我有一个股票数据库,保存如下:

[
  {
    _id: ObjectId("637b826fcef6ee66c879d5f3"),
    ticker: 'AA',
    quotes: [
      {
        volume: 14092516,
        open: 64.71,
        close: 67.37,
        high: 68.58,
        low: 62.46,
        transactions: 123967,
        date: '2022-04-25'
      },
      {
        volume: 7984906,
        open: 67.15,
        close: 66.97,
        high: 69.03,
        low: 64.67,
        transactions: 81841,
        date: '2022-04-26'
      }
    ]
  },
  {
    _id: ObjectId("637b92270e5e92b99783dcf9"),
    ticker: 'AAPL',
    quotes: [
      {
        volume: 96017376,
        open: 161.12,
        close: 162.88,
        high: 163.17,
        low: 158.46,
        transactions: 925124,
        date: '2022-04-25'
      },
      {
        volume: 95595226,
        open: 162.25,
        close: 156.8,
        high: 162.34,
        low: 156.72,
        transactions: 899965,
        date: '2022-04-26'
      }
    ]
  }
]

如何编写查询来获取特定日期的特定股票报价?
例如,我如何编写一个查找或聚合查询,以获取日期为2022年4月25日的AAPL报价

ukdjmx9f

ukdjmx9f1#

您可以使用的最简洁的语法可能是:

db.collection.find({
  ticker: "AAPL",
  "quotes.date": "2022-04-25"
},
{
  ticker: 1,
  "quotes.$": 1
})

Playground example here
也就是说,这里有一些额外的考虑:

  • 投影去掉了文档中的所有附加字段,因此您必须手动添加任何希望返回给客户机的字段(就像我在这里对ticker: 1所做的那样)。
  • 将表示日期的值存储为字符串通常不是一个好的做法,请考虑修改此做法。
  • 使用其他方法可以获得更大的灵活性,例如聚合中的$filter通过$addFields

下面是一个更详细的聚合替代方法的示例:

db.collection.aggregate([
  {
    $match: {
      ticker: "AAPL",
      "quotes.date": "2022-04-25"
    }
  },
  {
    "$addFields": {
      quotes: {
        $filter: {
          input: "$quotes",
          cond: {
            $eq: [
              "$$this.date",
              "2022-04-25"
            ]
          }
        }
      }
    }
  }
])

Playground demonstration here

相关问题