我有以下数据结构:
我正在尝试运行以下查询:
where a.B._id == 'some-id' and a.B.C.UserId=='some-user-id'.
这意味着我需要找到一个带有相关UserId的C文档的B文档,例如:
Query.And(Query.EQ("B._id", id), Query.EQ("B.C.UserId", userId));
这当然不好,因为它可能会找到具有该ID的B和另一个具有该UserId的C的不同B.不好。
如何用官方驱动程序编写?
答案 0 :(得分:3)
如果问题只是在B上的两个谓词在不同的B实例上进行评估(“它可能找到带有该ID的B和另一个带有该UserId的C的不同B”),那么解决方案是使用运算符这说“在集合中找到一个满足两者这些谓词的项目”。
似乎$elemMatch operator确实如此。 来自文档:
使用$ elemMatch检查数组中的元素是否与指定的匹配表达式匹配。 [...]
请注意,单个数组元素必须 符合指定的所有标准; [...]
只有在数组元素中必须匹配多个字段时才需要使用它。
试试这个:
Query.ElemMatch("B", Query.And(
Query.EQ("_id", id),
Query.EQ("C.UserId", userId)
));
以下是对$elemMatch and dot notation的一个很好的解释,它完全符合这种情况。