2013-06-28 148 views
1

我在我的Flask應用程序(mongoengine)中使用mongoDB(mongoHQ)。 我有一個Document,看起來像這樣:在mongoDB(mongoengine)中通過鍵獲取列表中的字典

{items: [{id: 1}, {id: 2}, {id: 3}]} 

是否有到達的方式,例如,在單個查詢dictid: 1

目前我正在通過items列表循環播放next()聲明,我希望有一個更明智的解決方案。謝謝

+0

對不起,我刪除它。 – Rohit

回答

0

在DB查詢或python語句?

使用Python:

In [21]: d = {"items": [{"id": 1}, {"id": 2}, {"id": 3}]} 

In [22]: [i for i in d["items"] if i["id"] == 1] 
Out[22]: [{'id': 1}] 

(添加[0]到列表樣稿年底剛剛拿到字典)

也可以使用發電機:

In [23]: (i for i in d["items"] if i["id"] == 1) 
Out[23]: <generator object <genexpr> at 0x052A1D50> 

In [24]: _.next() 
Out[24]: {'id': 1} 

我會親自以上述方式進行,因爲我們正在從數據庫返回記錄。

如果您想直接提取場(假設我們只希望返回的第一個文件,它具有{"id":1}):

In [35]: class Doc(Document): 
    ...:  items = ListField(DictField()) 
    ...:  

In [36]: newdoc = Doc(items=[{"id":1},{"id":2},{"id":3}]) 

In [37]: newdoc.save() 
Out[37]: <Doc: Doc object> 

In [38]: for document in [d for d in Doc.objects(items__id=1).first().items if d["id"]==1]: 
    ...:  print document 
    ...:  
{u'id': 1} 

僅僅抽取匹配是困難的字典,因爲外地實際上是一個字典列表。你並沒有通過修改查詢來保存任何速度,只返回匹配的字段部分,所以只需返回完整的字段並從python中獲取你想要的位。相同的速度,更容易維護。

+0

謝謝,但我的意思是在查詢中。正如我所提到的,我可以在python中獲得我需要的操作。 – Kreutzer

+0

修正了從數據庫中提取匹配記錄的版本,但拼接返回的記錄字段只顯示匹配的部分將在數據庫方面比從Python更慢 – TyrantWave

5

我對MongoEngine不熟悉,但$ projection操作符可以過濾數組以僅顯示匹配的元素。在蒙戈外殼:

> db.foo.insert({"items": [{"id": 1}, {"id": 2}, {"id": 3}]}) 
> db.foo.find({'items.id': 1}, {'items.$': true}) 
{ "_id" : ObjectId("51ce29b68b178484ff2a01ed"), "items" : [ { "id" : 1 } ] } 

更多信息:http://docs.mongodb.org/manual/reference/projection/positional/

似乎在MongoEngine你做:

Foo.objects(__raw__={'items.id': 1}).only('items.$') 

更多:http://mongoengine-odm.readthedocs.org/en/latest/guide/querying.html#raw-queries

+0

是啊我遇到了這個,但可悲的是我couldn不要讓它與mongoengine一起工作。雖然 – Kreutzer

+0

編輯我的答案 –

+0

我一直在嘗試變化,你建議整個上午,但無濟於事。它輸出關於「'items。$'」部分的錯誤。如果我排除它,我只是得到'',而我真正想得到的是字典。謝謝 – Kreutzer

相關問題