0

我有一个A包含b特定类型 EmbeddedDocument 的 ListField 的Document B,它有两个 StringFieldsxy.

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=x1和的特定条目的实例y=y1

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

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

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

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

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

提前致谢。

4

2 回答 2

1

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

例如:Find Query

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

希望这会帮助你。

于 2014-08-23T04:59:03.460 回答
0

我在 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。

于 2014-08-23T23:18:09.993 回答