7

公式の MongoDB C# ドライバーのバージョン 1.5.0.4566 を使用しています。Mongo バージョン 2.06 を使用しています。

私のドキュメント構造は次のようになります (この説明には不要なフィールドを省略しています)。

{ "Parents" : 
   [ 
     {
     "CreatedOn": ISODate("2012-07-28T15:30:06.623Z"),
     "Title": "Simple Title",
     "Children": [   
                  { "StatusId": 1, "Active" : true, SubChild : { "ExpiresOn": ISODate("2012-07-28T15:30:06.623Z")}},
                  { "StatusId": 1, "Active" : true, SubChild : { "ExpiresOn": ISODate("2012-08-28T15:30:06.623Z")}}
                 ]
     },
     {
     "CreatedOn": ISODate("2012-07-28T15:30:06.623Z"),
     "Title": "Another Simple Title",
     "Children": [   
                  { "StatusId": 1, "Active" : true, SubChild : { "ExpiresOn": ISODate("2012-07-28T15:30:06.623Z")}},
                  { "StatusId": 1, "Active" : true, SubChild : { "ExpiresOn": ISODate("2012-08-28T15:30:06.623Z")}}
                 ]
     }
   ]
}

StatusId が 1 で、Active が true の Children を照会したい場合は、ElemMatch を使用できます。

Query.ElemMatch("Children", Query.And(Query.EQ("StatusId", 1),Query.EQ("Active",true)));

うまくいかないのは、クエリに SubChild 要素を含める必要がある場合です。

Query.ElemMatch("Children", Query.And(Query.EQ("StatusId",1), Query.EQ("Active",true),Query.LT("SubChild.ExpiresOn",DateTime.UtcNow)));

クエリに SubChild.ExpiresOn フィールドを含めようとすると、クエリは値を返しません。このクエリを作成するさまざまな方法を試しましたが、SubChild.ExpiredOn フィールドを含めるとドキュメントがゼロのままになります。

私は何が欠けていますか?

ありがとう、

4

1 に答える 1

14

代わりにこれを試してください

Query.ElemMatch("Children", Query.And(Query.EQ("StatusId",1), Query.EQ("Active",true),Query.LT("SubChild.ExpiresOn",DateTime.UtcNow)));

このクエリが魔法のように機能する理由を知りたいですか? そうです(StatusIdvs StatusID)。JavaScript では大文字と小文字が区別されます。

次のように厳密に型指定された Linq クエリを使用することで、この問題を解消できます。

from x in collection.AsQueryable()
where x.Children.Any(child => 
    child.StatusId == 1 
    && child.Active 
    && child.SubChild.ExpiresOn < DateTime.UtcNow)
select x
于 2012-08-19T04:47:18.193 に答える