2015-10-14 202 views
-2

我在調用方法''newDiscussion'的用戶頁面上有一個表單,用於在登錄的用戶(以下稱爲user1)和用戶的頁面之間創建新的討論對象'繼續(以下簡稱:用戶2)。它還創建了一個帶有與新創建的討論對象相匹配的discussionId的消息對象。如何檢查集合中是否存在字段值

在討論對象中,我存儲了user1._id和user2._id。

我想檢查一個現有的討論對象是否包含這兩個用戶ID。如果爲false,則按上述步驟操作,否則只需插入消息並使discussionId與現有討論對象Id相匹配。

+0

你怎麼樣UPSERT的討論? –

+0

我需要先找到討論 - 這是停止創建另一個已經有兩個用戶ID的討論。 – JRedford

+0

沒有任何代碼,不可能提供任何真正的幫助。理論上,創建一個變量來進行討論,解析現有的討論對象並尋找這2個ID。如果你發現它們,然後填充你剛剛做出的討論var並退出循環。循環之後,如果討論對象未定義,則將其實例化爲討論對象。 – Archer

回答

0

假設你已經在討論發佈到你的客戶,你可以使用collection.findOne方法在客戶端代碼這樣

var dicussion = Discussions.findOne({'user1._id': Meteor.userId(), 'user2._id': 'another user id'}); 

if (discussion) { 
    // do some updates, if necessary 
} 
else { 
    // else create a new discussion 
} 
+0

是否findOne返回true/false或找到的文檔對象?我正在使用你的代碼,並且發生了一些奇怪的事情,if和else語句都正在執行。爲了讓事情變得簡單,我試圖弄清楚這一點,if語句是console.log('Discussion exists')和其他console.log('沒有討論')。但是,當我調用這個方法(這是服務器端代碼)時,if語句輸出到Meteor控制檯日誌,else語句輸出到瀏覽器控制檯。這裏是整個Meteor.methods代碼 - [鏈接](https://jsfiddle.net/xLue5xqt/) - 感謝您的幫助,同時我學習! – JRedford

+0

首先要注意的是,客戶正試圖對您的方法進行樂觀的運行。這可能是因爲您在共享位置定義了您的方法(意味着它對服務器和客戶端均可見)。客戶端樂觀地運行該方法,但仍會等待來自服務器的響應。在你的情況下,客戶端的minimongo中沒有討論文檔(我們需要使用pub/sub來解決這個問題),但服務器總是可以訪問討論集合。現在,我們需要討論你想要返回到瀏覽器的內容(例如文檔或布爾型) –

+0

如果你想返回文檔,你應該使用發佈/訂閱流星函數;否則,你可以返回true/false,客戶端可以做出相應的響應。在做出決定時需要考慮以下事項......流星會執行唯一的用戶名驗證服務器端(使用Meteor.methods),並向客戶端而不是用戶文檔返回true/false值。這是首選,因爲他們不想將用戶文檔公開給客戶端。 –

相關問題