2016-06-08 28 views
1

這是我以前的question這裏的stackoverflow.com的後續問題。如何使用Meteor和MongoDB從陣列中的對象返回子文檔

首先,感謝@David Weldon:我能夠正確構建我的更新。但是,當我從數據庫中獲取輸出時,我添加到score接縫處的對象將會丟失。

也許這是默認行爲db.ideas.find()。我期望在執行db.ideas.find()時也可以獲得子文檔。

代碼我跑:從蒙戈DB控制檯

Ideas.update("bKXXrpYmppFBfq9Kx", { 
    $addToSet: { 
    score: { userId: "W9YEs84QFhZzJeB6j", score: 1 }, 
    votedOnBy: "W9YEs84QFhZzJeB6j" 
    }, 
    $inc: { 
    overallScore: 1, 
    timesVotedOn: 1 
    } 
}); 

輸出:

meteor:PRIMARY> db.ideas.find() 
{ 
    "_id" : "bKXXrpYmppFBfq9Kx", 
    "title" : "Jump through the portal", 
    "body" : "The elves from Eldernland should jump through the blue portal mentioned in episode one.", 
    "userId" : "W9YEs84QFhZzJeB6j", 
    "author" : "Nate Beck", 
    "episodeId" : "LbDynnAHxAgM5PPXM", 
    "timestamp" : ISODate("2016-06-07T20:37:05.775Z"), 
    "votedOnBy" : [ 
     "W9YEs84QFhZzJeB6j" 
    ], 
    "timesVotedOn" : 3, 
    "score" : [ 
     { 

     } 
    ], 
    "overallScore" : 1 
} 

我期待看到什麼是「分數」這看起來像一個空的對象。

任何想法這裏發生了什麼錯?

+0

'.find()'和'.findOne()'格式稍有不同的流星蒙戈控制檯,嘗試了後者。或嘗試'db.ideas.findOne(id).score' –

+0

@Jeremy我懷疑你只是看到以前嘗試插入的文檔和/或你從多個地方插入。如果這是一個開發環境,請嘗試執行'db.ideas.remove({})',然後再次啓動該應用程序(或執行「流星重置」)。另請參閱[常見錯誤](https://dweldon.silvrback.com/common-mistakes)查找vs findOne與流星中的獲取。 –

+0

[@Michel Floyd](http://stackoverflow.com/users/2805154/michel-floyd):感謝您的建議。我試過了,沒有運氣。這是[我的主機的輸出:](https://git.io/vom7c)https://git.io/vom7c –

回答

0

!已解決!

這裏的問題是,我不知道什麼包aldeed:collection2正在做我的代碼。我添加了這個包來使用OrionJS(這裏是github page)。我沒有注意到這aldeed:collection2是強制驗證我所有的更新。我之前遇到過這個問題,但它給了我一個錯誤。在過去,我能夠追查錯誤。這一次,有任何地方都沒有錯誤。它會更新數組,但是有一個空對象。很混亂。我將在aldeed:collection2的項目頁面上發佈一個問題。

project documentation:「[aldeed:collection2是]流星包,允許你的模式附着到Mongo.Collection 插入和更新從客戶端或服務器代碼時自動驗證針對該架構。」。

用於校正的documentation可以找到here


解決方法:

因爲我使用aldeed:simple-schemaaldeed:collection2我需要確保以正確的「架構」連接到我的收藏。

像這樣:

Ideas.attachSchema(new SimpleSchema({ 
    // ... a bunch of other schema data 

    // I was missing this: 
    score: { 
    type: [Object], 
    optional: true, 
    label: 'Score', 
    }, 
    "score.$.userId": { 
    type: String, 
    optional: true, 
    label: 'Score' 
    }, 
    "score.$.score": { 
    type: String, 
    optional: true, 
    label: 'Score' 
    } 

    // ... a bunch more schema data 
}); 

故障排除:

我怎麼算出這個?

嗯,我是新來的MongoDB - 所以我不願意去控制檯,只是嘗試從那裏做更新。事實上,直到我和我妻子說話之前,我纔想到這一點。

我試了一下,在附近加了引號一切都是,看着別人的代碼。我檢查了所有MongoDB的優秀文檔。我看着YouTube視頻。我看着其他stackoverflow.com解決方案。最後,我想到其他人的代碼看起來完全像我的代碼,這應該是正常的。我甚至在Clarity.fm上註冊,以每分鐘1美元的價格從Sacha Greif提問。

...我開始認爲我的mongo數據庫沒有工作。也許我的mongo安裝被打破了嗎?

所以,好吧,對於一個測試。經過這樣的折磨它終於來到了我兩天 - 就嘗試在蒙戈控制檯更新......(杜)

meteor:PRIMARY> db.ideas.update({_id:"DqEGjK3xSTBdpEgXa"}, {$addToSet: {score: {userId: "123456", score: 1}}}) 
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) 
meteor:PRIMARY> db.ideas.find() 
{ 
    "_id" : "DqEGjK3xSTBdpEgXa", 
    "title" : "Revive Randolf With Bloodmagic", 
    "body" : "Bring Randolf back from the dead using witche's bloodmagic.", 
    "userId" : "Rz28ByKYM4Y8futFb", 
    "author" : "Iryna Iglehart", 
    "episodeId" : "iQaxyLPi5iaYtQngf", 
    "timestamp" : ISODate("2016-06-08T17:37:57.237Z"), 
    "score" : [ 
    { 
     "userId" : "123456", 
     "score" : 1 
    } 
    ], 
    "overallScore" : 0, 
    "votedOnBy" : [ ], 
    "timesVotedOn" : 0 
} 

一旦我知道mongo可以做我的更新 - 我知道問題必須與我的流星設置。如果這是一個問題,我現在會發現流星問題。我搜索谷歌的每個黑暗角落,試圖找出這一個。

不久之前我記得我之前有奇怪驗證問題。除了這些驗證問題總是會出現錯誤。事實上沒有錯誤,數組只是簡單地用空對象更新,真的讓我有一個循環。


我學到了什麼:

  1. 如果在第一流星失敗,請嘗試蒙戈控制檯...
  2. @David Weldon的評論 - 另一個很好的調試技術,它會幫助我,我很久以前就可以嘗試的是開始一個新的流星計劃,並在那裏測試我的代碼,然後一次添加一個軟件包,並查看它/它們中的任何一個是否破壞代碼。這個測試應該指出,從根本上說,代碼是正確的,並且只需要附加的程序包就可以了。
  3. 請勿盲目添加包裹。瞭解如果/當包轉變發展這樣的流程爲aldeed:collection2

謝謝:

非常感謝@Michel Floyd@David Weldon您對這個問題的所有幫助。


重要鏈接:

  1. 我學到common mistakes不少由@David Weldon
  2. documentation for aldeed:collection2
  3. documentation for aldeed:simple-schema
  4. 搜尋有關this meteor tutorial 「查找數據」 寫 - 它說話關於fetch()以及它如何有用。這幫助我解決了這個問題。
  5. 回顧documentation on about update從MongoDB的
  6. MongoDB $addToSet Documentation
  7. MongoDB $push Documentation
  8. [MongoDB的BIOS實例收藏](https://docs.mongodb.com/manual/reference/bios-example-collection/] - 它看着像這樣,我真的想通了文件後,有什麼錯我的數據庫設計,那裏應該是一個辦法做到這一點一直(且有,很明顯)

相關問題:

[Solved] How to Update An Array of Subdocuments on a MongoDB Collection in MeteorJS

+0

好的寫作。另一個重要的調試技巧是從一個空的項目開始,添加一些東西,直到它無法正常工作。在這種情況下,一個沒有collection2的單文件應用程序會證明代碼基本上是正確的。 –

+0

[@David Weldon](http://stackoverflow.com/users/635981/david-weldon):非常感謝 - 你說得對。有趣的是,我創建了一個項目來回答別人的問題[這裏](http://stackoverflow.com/a/37692455/484732) - 我主要是爲了讓他清楚起見。但現在你說我意識到我也可以爲自己做到這一點,但在我的情況下,作爲一種調試技術。我是流星的新手(正如你所看到的)。非常感謝您的時間和關注。 –

相關問題