Mongoengine,仅重新获得一些MapField

时间:2012-05-21 04:18:48

标签: python django mongodb pymongo mongoengine

例如..在Mongodb ..

> db.test.findOne({}, {'mapField.FREE':1})
{
    "_id" : ObjectId("4fb7b248c450190a2000006a"),
    "mapField" : {
            "BOXFLUX" : {
                    "a" : "f",
            }
    }
}

'mapField'字段由Mongoengine的MapField组成。 'mapField'字段有一个键和数据的日志..但我只检索'BOXFLUX'..

这个查询在MongoEngine中不起作用.... 例如......

BoxfluxDocument.objects( ~~ querying ~~ ).only('mapField.BOXFLUX')

你可以看到.. only('mapField.BOXFLUX')或仅 only('mapField__BOXFLUX')不起作用。 它检索所有'mapField'数据,包括'BOXFLUX'一个..

如何只检索MapField的字段???

3 个答案:

答案 0 :(得分:5)

我看到有一张票:https://github.com/hmarr/mongoengine/issues/508

为我工作的是一个示例测试用例:

def test_only_with_mapfields(self):

    class BlogPost(Document):
        content = StringField()
        author = MapField(field=StringField())

    BlogPost.drop_collection()

    post = BlogPost(content='Had a good coffee today...', 
                    author={'name': "Ross", "age": "20"}).save()

    obj = BlogPost.objects.only('author__name',).get()

    self.assertEquals(obj.author['name'], "Ross")
    self.assertEquals(obj.author.get("age", None), None)

答案 1 :(得分:3)

试试这个:

query = BlogPost.objects({your: query})
if name:
    query = query.only('author__'+name)
else:
    query = query.only('author')

答案 2 :(得分:1)

一如既往,罗斯真的非常感谢!!!!!!!!!

我发现了我的错......就是......我只使用了'两次'..

例如,

BlogPost.objects.only('author').only('author__name') 
像这样......

我花了一整天的时间来发现Mongoengine的问题..

所以..我的愚蠢结论是......

BlogPost.objects()._collection.find_one(~~ filtering query ~~, {'author.'+ name:1})
像这样......

但是你知道它只是一个原始数据而不是mongoengine查询..

在这段代码之后,我无法运行任何mongoengine方法......

反正..

在我的情况下,我应该根据某些条件进行查询。

因此,“仅”方法会覆盖以前编写的“仅”方法,这将是很棒的。在我的拙见中。

我希望此功能可以与下一版本集成。

现在,我必须编写重复的代码..例如..

不是这段代码......

query = BlogPost.objects()
query( query~~).only('author')
if name:
    query = query.only('author__'+name)

此代码

query = BlogPost.objects()
query( query~~).only('author')
if name:
    query = BlogPost.objects().only('author__'+name)

所以......我想..第二个看起来比第一个更脏。

当然,第一个代码会显示所有数据 使用“only('author')”not only only('author__name')

非常感谢!!!!!!!!!

罗斯,你救了我!!!谢谢..(我以为Mongoengine不能简单地做那些查询。)