python/mongodb 更新和子树结构
这是一个示例文档,里面包含了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"
}
关于这个,有几个问题:
有没有办法在文档内部进行索引,而不是在集合中?我想能方便地按日期查找数据,或许有更好的方法来组织这些数据?
我对如何获取或更新特定的价格数据感到困惑,我尝试用以下方式添加新的价格数据:
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'
},
]
你如何通过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中自己提取出你想要的那个元素。