2014-02-13 60 views
0

我有這些類:在陣列結合了父文檔的屬性值和ElemMatch

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))); 

不過,我得到這些結果:

如果沒有父母3245,無返回值(正確的)。

當父3245沒有孩子時,查詢返回什麼(錯誤)。

當父3245有一個小孩3歲時,查詢返回父(正確)。

當父母3245有一個孩子3歲和一個孩子5歲時,查詢返回父母(錯誤)。

當父母3245有一個孩子3歲和一個孩子7歲時,查詢返回父母(正確)。

它看起來好像查詢的第一部分(Parent.Id)起作用。但是下半場似乎總是返回父節點,除非列表爲空。

回答

0

要解決第一個問題,您似乎必須使用Query.Or環繞Query.ElemMatch和另外的Query.Exists以測試何時不存在子元素的情況。

關於第二個問題,似乎Mongo類型展開了子數組,並且如果它找到與您的查詢匹配的文檔,它將該查詢標記爲true。因此,在3歲和5歲的情況下,發現3(不等於5)的事實滿足查詢並得到錯誤的結果。 我想,但我不是100%肯定這是最好的方法,最好是使用Query.Not(Query<Child>.EQ(c => c.ChildInfo.Age, 5))