我在 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;
}
最佳答案
Is it possible to write one query which by which I can get the user for id 1 along with the snapshots after a particular day. eg: 1312330300?
不可能。
这里的问题是 MongoDB 查询返回所有匹配的文档。您的文档包含一组对象,但 MongoDB 不会将这些视为“文档”。
现在,您可以限制返回的字段,但在您的情况下,您实际上想要限制返回的“数组部分”。
这是一个长期悬而未决的问题,JIRA 票证是 here .这张罚单的日期大约是 18 个月前,但一直被推迟。因此,如果此类查询对您的架构至关重要,您可能需要重新设计架构。
关于mongodb - 蒙戈 : Selecting X elements from an array placed in an object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7606284/