2

例如..在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 的一个字段???

4

3 回答 3

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)
于 2012-05-21T10:54:51.967 回答
3

试试这个:

query = BlogPost.objects({your: query})
if name:
    query = query.only('author__'+name)
else:
    query = query.only('author')
于 2012-05-22T05:58:42.517 回答
1

我发现我的错了!我用only了两次。

例如:

BlogPost.objects.only('author').only('author__name') 

我花了一整天的时间找出问题所在Mongoengine

所以我的错误结论是:

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

但如您所知,这只是原始数据而不是mongoengine查询。

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

就我而言,我应该根据某些条件进行查询。

所以'only'方法会覆盖之前写的'only'方法会很棒..在我的拙见中。

我希望这个功能将与下一个版本集成。现在,我必须编写重复的代码:

不是这段代码:

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('author__name')

于 2012-05-21T14:14:29.367 回答