python/mongodb 更新和子树结构

2 投票
1 回答
647 浏览
提问于 2025-04-17 10:51

这是一个示例文档,里面包含了OHLC股票数据,内容被截断了(通过python打印)。

{
   "_id":ObjectId("4f1c567d60de7d0908000000"),
   "ticker" : "msft"
   "pricing":[
      {
         "Volume":"2094300",
         "Adj Close":"85.87",
         "High":"88.11",
         "Low":"87.45",
         "Date":         ISODate("2011-01-14T00:00:00         Z"),
         "Close":"88.10",
         "Open":"87.74"
      },
      {
         "Volume":"2351900",
         "Adj Close":"85.81",
         "High":"88.87",
         "Low":"87.76",
         "Date":         ISODate("2011-01-13T00:00:00         Z"),
         "Close":"88.04",
         "Open":"88.47"
      },
      {
         "Volume":"2732900",
         "Adj Close":"86.42",
         "High":"88.76",
         "Low":"87.92",
         "Date":         ISODate("2011-01-12T00:00:00         Z"),
         "Close":"88.66",
         "Open":"88.02"
      }

关于这个,有几个问题:

  1. 有没有办法在文档内部进行索引,而不是在集合中?我想能方便地按日期查找数据,或许有更好的方法来组织这些数据?

  2. 我对如何获取或更新特定的价格数据感到困惑,我尝试用以下方式添加新的价格数据:

    var = collection.find({ 'ticker' : ticker}) //找到正确的文档

    var[0].update( { '$push' : { 'pricing' : newpricingdata } }) //更新该公司的值

但是这样不行。查找是没问题的,更新却不行。

newpricingdata看起来像这样(python打印):

[
   {
      'Volume':'3522600',
      'Adj Close':'85.65',
      'High':'85.70',
      'Low':'84.96',
      'Date':datetime.datetime(2012,1,20,0,0),
      'Close':'85.65',
      'Open':'85.45'
   },
   {
      'Volume':'3413700',
      'Adj Close':'85.80',
      'High':'86.23',
      'Low':'84.92',
      'Date':datetime.datetime(2012,1,19,0,0),
      'Close':'85.80',
      'Open':'85.10'
   },

]
  1. 你如何通过python获取2012年1月20日的msft股票价格?mongodb的文档里没有给出很好的子树操作示例……

1 个回答

2

如果你想按日期查询的话,可以这样做:

collection.ensureIndex({"pricing.Date" : 1}) 

要更新价格数据,你需要在collection上调用update()方法,就像在同一个collection上调用find()一样。而且因为newpricingdata是一个数组,所以你需要用到$pushAll:

collection.update({ "_id" : ObjectId("4f1c567d60de7d0908000000")}, { '$pushAll' : { 'pricing' : newpricingdata } }, false, false); 

问题:

你怎么用python获取2012年1月20日的msft股票价格呢?mongodb的文档里没有给出很好的子树操作的例子...

其实,mongodb不支持只查询并返回数组中匹配的元素,它会把整个数组都返回给你。这就意味着你需要在python中自己提取出你想要的那个元素。

撰写回答