【问题标题】:Query with multiple conditions on a nested entry in MongoEngine在 MongoEngine 中的嵌套条目上使用多个条件进行查询
【发布时间】:2014-08-23 03:40:13
【问题描述】:

我有一个文档 A,其中包含一个特定的 ListField b 输入 EmbeddedDocument B,其中有两个 StringFields xy

class B(EmbeddedDocument):
    x = StringField()
    y = StringField()

class A(Document):
    b = ListField(EmbeddedDocumentField(B))

让我们先填充它们:

b1 = B(x="x1", y="y1")
b2 = B(x="x2", y="y2")
a = A(b=[b1, b2])
a.save()

我想搜索 A 的实例,其中包含特定的 条目 B 的值为 x=x1y=y1

我尝试使用两个contains 构建一个查询,每个值一个。

A.objects(b__x__contains="x1", b__y__contains="y1")
[<A: A object>]

成功案例有效。问题是条件是 独立,那么它们可以匹配列表b的不同条目:

A.objects(b__x__contains="x1", b__y__contains="y2")
[<A: A object>]

在 MongoEngine 中有没有办法确保这两个条件 会在同一个条目中应用吗?

提前致谢。

【问题讨论】:

    标签: mongodb mongoengine querying embedded-documents nosql


    【解决方案1】:

    据我所知,您的问题。你可以试试$elemMatch

    例如:Find Query

    db.A.findOne(
       {
         b : {$elemMatch : {"x":"x1", "y":"y1"}}
       }
    );
    

    希望这会对你有所帮助。

    【讨论】:

    • 嗨,Afil,非常感谢您的快速回答!我想最好通过 MongoEngine 来完成。如果我不能完成它,很高兴记住我可以在 MongoEngine 进行 MongoDB 调用并使用 $elemMatch。最好的问候!
    【解决方案2】:

    我在 MongoEngine Github 的一个 issue #379 中找到了答案。

    $elemMatch 被映射到field__match

    所以成功案例有效:

    A.objects(b__match={"x": "x1", "y": "y1"})
    [<A: A object>]
    

    错误的情况一失败:

    A.objects(b__match={"x": "x2", "y": "y1"})
    []
    

    非常感谢 Afil 告诉我我需要的东西相当于 $elemMatch。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多