我在我的Flask应用程序(mongoengine)中使用mongoDB(mongoHQ)。 我有一个Document
,看起来像这样:在mongoDB(mongoengine)中通过键获取列表中的字典
{items: [{id: 1}, {id: 2}, {id: 3}]}
是否有到达的方式,例如,在单个查询的dict
有id: 1
?
目前我正在通过items
列表循环播放next()
声明,我希望有一个更明智的解决方案。谢谢
我在我的Flask应用程序(mongoengine)中使用mongoDB(mongoHQ)。 我有一个Document
,看起来像这样:在mongoDB(mongoengine)中通过键获取列表中的字典
{items: [{id: 1}, {id: 2}, {id: 3}]}
是否有到达的方式,例如,在单个查询的dict
有id: 1
?
目前我正在通过items
列表循环播放next()
声明,我希望有一个更明智的解决方案。谢谢
在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中获取你想要的位。相同的速度,更容易维护。
谢谢,但我的意思是在查询中。正如我所提到的,我可以在python中获得我需要的操作。 – Kreutzer
修正了从数据库中提取匹配记录的版本,但拼接返回的记录字段只显示匹配的部分将在数据库方面比从Python更慢 – TyrantWave
我对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
对不起,我删除它。 – Rohit