MongoDB + C#驱动程序 + 查询包含子文档的元素数组的查询

7
我使用的是官方 MongoDB C# 驱动程序的 1.5.0.4566 版本。MongoDB 的版本号为 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")}}
                 ]
     }
   ]
}

如果我想查询状态ID等于1且活动状态为真的孩子,我可以使用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字段时都会得到零个文档。

我错过了什么吗?

谢谢,

1个回答

14

可以试试这个:

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

你为什么觉得这个查询神奇地运行了呢?这是因为 (StatusIdStatusID )区分大小写。JavaScript是大小写敏感的。

你可以通过使用强类型化的Linq查询来消除这个问题,例如:

from x in collection.AsQueryable()
where x.Children.Any(child => 
    child.StatusId == 1 
    && child.Active 
    && child.SubChild.ExpiresOn < DateTime.UtcNow)
select x

嗨@kelloti - 抱歉,语法不是问题。我在输入这个问题时将StatusID和StatusId输入错误。我会修复它。所以问题不在语法上,而是其他方面。谢谢! - RDotLee
我将尝试使用强类型查询。但我仍然很好奇为什么我的查询不起作用。谢谢! - RDotLee
那是唯一的问题。对于两个查询,我得到了2条记录(假设Parents实际上是一个集合而不是文档)。 - kelloti
1
谢谢@kelloti,非常感谢。Linq对我很有效。 - RDotLee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接