【问题标题】:MongoDB + C# driver + query array of elements where each array element contains sub-document to query onMongoDB + C# 驱动程序 + 查询元素数组,其中每个数组元素包含要查询的子文档
【发布时间】:2012-08-19 03:52:49
【问题描述】:

我使用的是官方 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 的子项,我可以使用 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 字段时,总是得到零个文档。

我错过了什么?

谢谢,

【问题讨论】:

    标签: c# mongodb


    【解决方案1】:

    试试这个

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

    想知道为什么这个查询会神奇地起作用吗?就是这样(StatusId vs 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
    

    【讨论】:

    • 嗨@kelloti - 抱歉,语法不是问题。输入此问题时,我错误地输入了 StatusID 和 StatusId。我会解决的。所以这不是语法,而是别的东西。谢谢!
    • 我会尝试强类型查询。但我仍然很好奇为什么我的查询不起作用。谢谢!
    • 这是唯一的问题。我得到两个查询的 2 条记录(假设 Parents 实际上是一个集合,而不是一个文档)
    • 谢谢@kelloti,非常感谢。 Linq 正在为我工​​作。
    猜你喜欢
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    相关资源
    最近更新 更多