2011-09-30 25 views
3

我有一个MongoDB的用户以下集合:蒙戈:从放置在一个对象数组选择X元素

{ 
    "_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

是否有可能写一个查询,通过这个查询,我可以在特定的一天之后为用户提供id 1以及快照。例如:1312330300?

不可能。

这里的问题是,MongoDB查询返回所有匹配的文档。您的文档包含一组对象,但MongoDB不会将它们视为“文档”。

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

这是一个长期未解决的问题,JIRA票证是here。这张票约18个月前,并继续推迟。因此,如果这种类型的查询对您的架构至关重要,则可能需要重新设计架构。

+0

哇!感谢那个超级快速的回答!对我的架构来说不是至关重要的,所以我最终修改了一些代码。会把它放在那里。再次感谢! :) – saurabhj