2011-09-30 59 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