将父文档中的属性值与数组中的ElemMatch组合在一起

时间:2014-02-13 20:27:00

标签: mongodb mongodb-.net-driver

我有这些课程:

public class Parent
{
    public int Id { get; set; }
    public List<Child> Children { get; set; }
}

public class Child
{
    public int Id { get; set; }
    public ChildInfo ChildInfo { get; set; }
}

public class ChildInfo
{
    public int Age { get; set; }

    ...other properties...
}

因此,给定一组父母,我需要返回一个具有特定ID的父级,但前提是它没有具有特定年龄的ChildInfo的子级。

我想我很亲近。以下是我到目前为止的情况:

var childQuery = Query<Child>.NE(c => c.ChildInfo.Age, 5);

var finalresult = collection.Find(Query.And(Query<Parent>.EQ(p => p.Id, 3245),
                                            Query<Parent>.ElemMatch( p => p.Children, builder => childQuery)));

但是,我得到了这些结果:

如果没有Parent 3245,则查询不返回任何内容(正确)。

当父3245没有子节点时,查询不返回任何内容(错误)。

当父3245有一个3岁的孩子时,查询返回父(正确)。

当父母3245有一个3岁的孩子和一个5岁的孩子时,查询返回父母(错误)。

当父母3245有一个3岁的孩子和一个7岁的孩子时,查询返回父母(正确)。

看起来好像查询的第一部分(Parent.Id)有效。但是下半部分似乎总是返回Parent,除非列表为空。

1 个答案:

答案 0 :(得分:0)

要解决第一个问题,您似乎必须使用Query.Or围绕Query.ElemMatch和其他Query.Exists来测试没有子元素的情况

关于第二个问题,似乎Mongo类似于展开子数组,如果找到与您的查询匹配的文档,它会将查询标记为true。因此,在3岁和5岁的情况下,它找到3,即不等于5,它满足查询并且得到错误的结果。 我想,但我不是100%肯定这是最好的方式,最好使用Query.Not(Query<Child>.EQ(c => c.ChildInfo.Age, 5))