2

我在我的 Flask 应用程序(mongoengine)中使用 mongoDB(mongoHQ)。我有一个Document看起来像这样的:

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

有没有办法在单个查询中达到例如dictwith ?id: 1

目前我正在用一个语句遍历items列表,next()我希望有一个更明智的解决方案。谢谢

4

2 回答 2

7

我不熟悉 MongoEngine,但 $ 投影运算符可以过滤数组以仅显示匹配的元素。在 Mongo 外壳中:

> 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

于 2013-06-29T00:27:57.977 回答
0

在数据库查询或 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]到列表 comp 的末尾以获取字典)

也可以使用生成器:

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 中获取您想要的位。相同的速度,更容易维护。

于 2013-06-28T09:16:41.750 回答