Mongo:从放置在对象中的数组中选择X元素

时间:2011-09-30 05:30:12

标签: mongodb mongodb-.net-driver

我为MongoDB中的用户提供了以下集合:

{
  "_id" : 1,
  "facebook_id" : XX,
  "name": "John Doe",
  "points_snapshot" : [{
      "unix_timestamp" : 1312300552,
      "points" : 115
    }, {
      "unix_timestamp" : 1312330380,
      "points" : 110
    }, {
      "unix_timestamp" : 1312331610,
      "points" : 115
    }]
}

是否可以编写一个查询,通过该查询,我可以获取id为1的用户以及特定日期之后的快照。例如:1312330300?

基本上将快照限制为符合某些条件的X数字?

到目前为止,我已尝试过C#:

Query.And(
 Query.EQ("facebook_id", XX), 
 Query.GTE("points_snapshot.unix_timestamp", sinceDateTimeStamp)))
 .SetFields("daily_points_snapshot", "facebook_id")

我很快意识到这对我想要的东西不起作用。

任何帮助将不胜感激! 谢谢!

编辑:我的解决方案

如果有人希望快速解决这个问题,那么我最终会这样做:

var points = MyDatabase[COLLECTION_NAME]
                .Find(Query.EQ("facebook_id", XX))
                .SetFields("points_snapshot", "facebook_id")
                .FirstOrDefault();

if (points != null) {
        var pointsArray = points.AsBsonDocument["points_snapshot"].AsBsonArray
        .Where(x => x.AsBsonDocument["unix_timestamp"].AsInt32 > sinceDateTimeStamp)
        .ToList();

        return pointsArray;
}

1 个答案:

答案 0 :(得分:1)

  

是否可以编写一个查询,通过该查询,我可以获取id为1的用户以及特定日期之后的快照。例如:1312330300?

不可能。

这里的问题是MongoDB查询返回所有匹配的文档。您的文档包含一系列对象,但MongoDB不会将这些对象视为"文档"。

现在,你可以限制返回的字段,但在你的情况下,你实际上想要限制数组的部分"返回。

这是一个长期悬而未决的问题,JIRA票证是here。这张票的日期大约是18个月前,并且继续被推迟。因此,如果此类查询对您的体系结构至关重要,则可能需要重新设计体系结构。