2

サンプルコードを持っている:

import mongoengine as mongo

class User(mongo.Document):
    name = mongo.StringField()
    age = mongo.IntField()    

class Post(mongo.Document):
    title = mongo.StringField()
    author = mongo.ReferenceField(User)

30 歳未満のユーザーが作成したすべての投稿を取得したいのですが、1 つの方法は、2 つのステップで要求を行うことです。

users = User.objects(age__lt=30)
posts = Post.objects(author__in=users)

しかし、これでも完全に悪いわけではなく、データベースを不必要に N 回呼び出して接続しています。だから私はたった1ステップでクエリを作成したいので、試しました:

posts = Post.objects(author__age__lt=30)

しかし、うまくいきません。エラーではなく空のリストを返すだけです。私は何を間違っていますか?

4

2 に答える 2

3

私は何を間違っていますか?

参照フィールド全体でクエリできないものはありません - Embed Vs Referenceを参照してください

そのため、構文がサポートされていたとしても、舞台裏で 2 つのクエリが必要になります。それが必要な場合-チケットをgithubに追加してください。追加を検討します:)

現在、MongoEngine への更新は迅速かつ迅速に行われています。そのため、新しいリリースがまもなくリリースされます。devブランチには、効率的な遅延逆参照やアトミック セーブのためのデルタの更新など、いくつかのエキサイティングな改善が行われています。

于 2011-06-17T07:17:17.387 に答える
1

...データベースを不必要にN回呼び出して接続しています

MongoDB は、$in1 つのクエリ、1 つの接続だけで複数のオブジェクトを選択できる句をサポートしています。複数の接続が見られる場合は、mongoengine の作成者に報告する必要があります。

MongoDB は結合をサポートしていないため、「ユーザーをロードし、投稿をロードする」という方法が一般的に正しい方法です。

私は何を間違っていますか?

このレベルの詳細については、作成者に直接連絡することをお勧めします。github ページには、彼の電子メールとブログの両方があります。リポジトリを見ると、彼の最後の更新は 2010 年 10 月で、最後のバージョン番号は 0.4 でした。この分野では 3 か月も更新がないというのは長い時間であり、彼はバージョン 1.0 すら持っていません。

于 2011-02-13T21:24:55.690 に答える