查询MongoEngine中嵌套条目的多个条件

时间:2014-08-23 03:40:13

标签: mongodb mongoengine querying embedded-documents nosql

我有一个文档A,其中包含特定的ListField b 输入EmbeddedDocument B,它有两个StringField 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实例 条目为Bx=x1的条目y=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中,有没有办法确保这两个条件 将在同一条目中应用?

提前致谢。

2 个答案:

答案 0 :(得分:1)

据我了解你的问题。您可以尝试$elemMatch

例如:Find Query

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

希望这会对你有所帮助。

答案 1 :(得分:0)

我在MongoEngine Github的问题#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。