10

私は次のモデルを持っています:

class Like(EmbeddedDocument):
    user = ReferenceField(User,dbref=False)
    date = DateTimeField(default=datetime.utcnow,required=True)
    meta = {'allow_inheritance': False}

class Post(Document):
   name = StringField(max_length=120, required=True)
   likes = ListField(EmbeddedDocumentField(Like))

いいねが20を超える投稿(ListFieldのサイズが20を超える)のみをフィルタリングしたいと思います。私は以下を使用してクエリを実行しようとしました:

posts = Post.objects.filter(likes__size_gte=20)
posts = Post.objects.filter(likes_gte=20)
posts = Post.objects.filter(likes__gte=20)
posts = Post.objects.filter(likes__size_gte=20)

それらのどれも動作しません。

しかし、完全一致(ListFieldサイズが正確に20いいね)を使用すると、次のように機能します。

posts = Post.objects.filter(likes__size=20) 

コメント?

4

2 に答える 2

17

完璧なソリューションとはほど遠いですが、生のmongoクエリと$ where演算子を使用して、次のように実行できます。

posts = Post.objects.filter(__raw__={'$where': 'this.likes.length > 20'})

もう1つのオプションは、より高速に動作するはずですが、私の意見ではあまり明確ではありませんが、21番目の要素が存在するかどうかを確認することです。

posts = Post.objects.filter(likes__21__exists=True)

2番目のオプションは、MongoDB2.2以降を使用している場合にのみ機能します

出典:これらの回答から取得し、MongoEngineに適用しました。

于 2014-01-12T11:02:35.380 に答える
4

値の範囲に$sizeを使用することはできません。

モンゴのサイトから:

$sizeは値の範囲を受け入れません。要素数が異なるフィールドに基づいてドキュメントを選択するには、フィールドに要素を追加するときにインクリメントするカウンターフィールドを作成します。

これは、答えにつながった関連する質問へのリンクです:mongoDBで配列フィールドのサイズが3未満のドキュメントを削除します

これは、上のブロックのドキュメントを提供する前のリンクにリンクされているmongoページです:http: //docs.mongodb.org/manual/reference/operator/size/#_S_size

テキストブロックで提案されているように、カウンターフィールドを追加してみてください。

于 2013-02-22T03:38:48.050 に答える