2010-02-13 76 views

回答

1

我認爲你的應用程序處理這種事情是正常的。如果數據以某種方式無效,請不要讓它被添加到數據存儲區,直到用戶更正了您檢測到的任何錯誤。

6

MongoDB沒有約束或觸發器,所以應用程序必須驗證數據。

如果存在無效數據,您也可以編寫每天檢查一次或更多的Javascript腳本。您可以使用它來檢查應用程序業務邏輯的質量。

0

我剛剛開始在基於Zend Framework的應用程序中使用MongoDB和PHP。

我爲每個MongoDB集合創建了1個對象(例如,User.php映射到用戶集合)。每個對象都知道它映射到哪個集合,以及需要哪些字段。它也知道哪些過濾器(Zend_Filter_Input)和驗證器(Zend_Validate)應該應用於每個字段。在執行MongoDB insert()或save()之前,我運行$ object-> isValid(),它執行所有驗證器。如果他們全部通過isValid()將返回true,然後繼續運行insert()或save(),否則我會顯示錯誤。

1

從2.4開始,MongoDB在寫入MongoDB數據文件時爲mongod和mongorestore啓用基本的BSON對象驗證。這可以防止任何客戶端將無效或格式錯誤的BSON插入到MongoDB數據庫中。 源:http://docs.mongodb.org/manual/release-notes/2.4/

7

的MongoDB 3.2開始它們加入document validationslides)。

您可以爲每個集合指定驗證規則,使用幾乎所有的Mongo的查詢操作使用validator選項(除$geoNear$near$nearSphere$text$where)。

要創建一個新的集合與驗證,使用方法:

db.createCollection("your_coll", { 
    validator: { `your validation query` } 
}) 

要驗證程序添加到現有的集合,你可以添加驗證:

db.createCollection("your_coll", { 
    validator: { `your validation query` } 
}) 

驗證只有在插入工作/更新,因此當您在舊集合上創建驗證器時,以前的數據將不會被驗證(您可以編寫以前數據的應用程序級驗證)。您還可以指定validationLevelvalidationAction來告訴如果文檔無法通過驗證會發生什麼情況。

如果您嘗試插入/更新的東西,失敗的驗證,(並沒有指定任何異樣validationLevel /動作)的文件,那麼你將得到一個錯誤的writeResult(可悲的是,誤差不告訴你什麼失敗而你得到的只是默認validation failed):

WriteResult({ 
    "nInserted" : 0, 
    "writeError" : { 
     "code" : 121, 
     "errmsg" : "Document failed validation" 
    } 
}) 
相關問題