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')は機能しません。「BOXFLUX」を含むすべての「mapField」データを取得します。

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

の何が問題なのかを調べるのに 1 日を費やしました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)

だから、2枚目は1枚目よりも汚く見えると思います。

もちろん、最初のコードはonly('author')notを使用してすべてのデータを表示しますonly('author__name')

于 2012-05-21T14:14:29.367 に答える