使用MongoDB查询集合中子对象的多个谓词(官方c#驱动程序)

时间:2011-06-25 20:44:05

标签: mongodb-.net-driver

我有以下数据结构:

    • _id
    • B []
      • _id
      • C []
        • _id
        • 用户ID

我正在尝试运行以下查询:

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.不好。

如何用官方驱动程序编写?

1 个答案:

答案 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的一个很好的解释,它完全符合这种情况。