我为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;
}
答案 0 :(得分:1)
是否可以编写一个查询,通过该查询,我可以获取id为1的用户以及特定日期之后的快照。例如:1312330300?
不可能。
这里的问题是MongoDB查询返回所有匹配的文档。您的文档包含一系列对象,但MongoDB不会将这些对象视为"文档"。
现在,你可以限制返回的字段,但在你的情况下,你实际上想要限制数组的部分"返回。
这是一个长期悬而未决的问题,JIRA票证是here。这张票的日期大约是18个月前,并且继续被推迟。因此,如果此类查询对您的体系结构至关重要,则可能需要重新设计体系结构。