2015-02-24 47 views
0

我有一個MongoDB的集合稱爲「選票」,它看起來像這樣:的MongoDB從結果返回一個嵌套的文件

{ 
    "_id" : "msw9ofwQSj58qiPvY", 
    "ballotName" : "This is the ballot name", 
    "votes" : [ 
    { "unitNumber" : "30", "voteResult" : "No", "voteDate" : ISODate("2015-02-24T05:03:22.937Z") }, 
    { "unitNumber" : "30", "voteResult" : "Yes", "voteDate" : ISODate("2015-02-24T05:20:02.479Z") } 
    ] 
} 

我只想看到最新的「votes.voteResult」這個_id和unitNumber:30。我嘗試:

db.ballots.find(
    { $and: [ 
    {_id: 'msw9ofwQSj58qiPvY'}, 
    {'votes.unitNumber': '30'} 
    ] }, 
    {'votes.voteResult': 1, 'votes.voteDate': 1, _id: 0}) 

結果:

{ 
    "votes" : [ 
    { 
     "voteResult": "No", 
     "voteDate" : ISODate("2015-02-24T05:03:22.937Z") 
    }, 
    { 
     "voteResult": "Yes", 
     "voteDate" : ISODate("2015-02-24T05:20:02.479Z") 
    } 
    ] 
} 

看起來不錯,但我只想要一個 「voteResult」 返回。我只想要最新的一個。我似乎無法弄清楚如何得到一個嵌套的結果集,並確保它是最近的一個。如果有任何幫助,我使用Meteor/JavaScript,它可能可以處理這種編碼邏輯,但希望簡單的MongoDB查詢可以給我結果。

任何幫助,非常感謝。謝謝。

+0

多少票,你在選票期待..你會怎麼找到「最新的」一個(通過voteDate?)。您是依靠Minimongo還是可以安裝額外的軟件包來訪問服務器端聚合功能(例如:[流星聚合](https://github.com/meteorhacks/meteor-aggregate/))? – Stennie 2015-02-24 06:15:54

+0

Mongo中每張選票文件的總票數約爲30-100。 Meteor使用我用於開發和測試的miniMongo,是的,我可以使用流星聚合。現在閱讀它...... – 2015-02-24 07:28:52

回答

0

您可以使用sortlimit這些東西:

db.ballots.find(
    { $and: [ 
    {_id: 'msw9ofwQSj58qiPvY'}, 
    {'votes.unitNumber': '30'}, 
    ] }, 
    {'votes.voteResult': 1, 'votes.voteDate': 1, _id: 0} 
).sort({'votes.voteDate':-1).limit(1); 

你得到兩個回來了,但如果你通過voteDate對它們進行排序,並返回第一個,你應該有一個你想要的。

您可能還可以用做這一切的服務器端的aggregate代替find

db.ballots.aggregate( 
    {$match : 
    {$and: [ 
     {_id: 'msw9ofwQSj58qiPvY'}, 
     {'votes.unitNumber': '30'}, 
    ]} 
    }, 
    {$unwind: "$votes"}, 
    {$sort: {'votes.voteDate': -1}}, 
    {$limit: 1}, 
    {$project: {'votes.voteResult': 1, 'votes.voteDate': 1, _id: 0}} 
); 
+0

除非Minimongo正在做一些與MongoDB服務器API(可能的)不同的東西,'sort'和'limit'光標選項通常只適用於文檔級別。用投票排序多個文檔可能沒問題,但不會從嵌入數組中返回預期結果(如問題中當前的示例文檔)。同樣,爲了在服務器端聚合中獲得預期的結果,您需要首先對嵌入數組進行$ unwind,然後使用$ sort和$ group來獲得每個文檔的單個「最新」匹配。 – Stennie 2015-02-24 12:22:24

+0

你是對的。我已經編輯了答案來說明這一點。 – 2015-02-25 00:13:30