2010-10-21 22 views
1

我正在將系統從sql server轉換爲mongodb。我相信這個項目是mongodb的一個很好的候選人,但那不是我的問題。MongoDB存儲過程(JavaScript函數),它將文檔作爲結果返回之前更新文檔?

在sql數據庫中,我有一個存儲過程,用於返回需要處理的一組記錄。所以,我已經在sql數據庫中處理了BIT和LastProcessingRequestDate DATETIME字段。在客戶端更新要處理的記錄= 1之前,記錄需要1秒到5分鐘的時間在客戶端進行處理。

我的存儲過程將返回一個TOP 100記錄,其中處理= 0和LastProcessingRequestDate < DATEADD(分鐘,-10,NOW()),但在它返回每條記錄之前,它會更新LastProcessingRequestDate = NOW()。這可以確保在處理完它們之前,我沒有收到任何已經處理的記錄(有一個單獨的線程負責保持隊列中有多個要處理的記錄,多個線程從中退出) 。

我想知道最好的做法是將這種情況轉移到MongoDB。我想到的一個想法是創建一個類似MongoDB的函數,但我沒有看到這種函數的任何示例。另一種方法是簡單地使用相同的邏輯,但在客戶端處理LastProcessingRequestDate的更新。這對我來說似乎不太理想。

有沒有人有我如何在MongoDB中編寫javascript函數的例子來做到這一點?謝謝!

回答

0

我真的認爲某種形式的「客戶端」或「業務對象/實體/數據對象」邏輯是爲了這裏。

另一種選擇是基本上構建多個集合並將這些集合用於故事「處理」項目。

+0

我在想什麼是獲取文檔_id然後做類似於: db.collection.update(「{_id:{$ in:[1,2,3]}}」,「{$ set :{lastProcessRequestDate:12345678}}「); 無論如何,這將產生預期的效果,只是不確定它是如何「高效」的。 – Redth 2010-10-21 16:24:04

+0

另外,多個集合並不能真正解決我的問題。我仍然需要一種將文檔標記爲「CurrentlyProcessing」的方法,以便在文檔完成處理之前,我不會嘗試再次抓取相同的文檔進行處理。 – Redth 2010-10-21 16:27:22

+0

我明白你來自哪裏。我對「$ in」條款的唯一體會是你不想讓它太長。您基本上要求Mongo進行100次索引查找,然後再進行100次查找來設置數據。事實上,你會問MySQL的相同的東西,所以我不確定任何一種方式是真正有效的:( – 2010-10-23 23:02:57