我有这些课程:
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,除非列表为空。
答案 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))
。