2016-06-07 61 views
3

在插入文檔時,我想使用mongodb文檔驗證功能檢查文檔中存在的所有鍵是否來自預定義的一組鍵。假定只有「一」,「B」,「C」被允許鍵和DOC1和DOC2下面定義是2個文件:使用文檔驗證程序確保文檔中僅存在某些鍵

{ 
    "a": "any_value", 
    "b":"any_other_value" 
}, 
{ 
    "a": "any_value", 
    "b": "any_other_value", 
    "d": "other_value" 
} 

在這種情況下是DOC1有效的文檔和DOC2是無效的。

另外,如果在上述情況下又添加了一個條件,那麼所有密鑰都必須存在?

注:我想知道這是否可以通過文檔驗證MongoDB中3.2

+0

什麼是你的客戶端API?如果它是nodejs,你可以使用moogoose框架來爲集合定義模式? – notionquest

+0

您可以在MongoDB 3.2 *中使用*文檔驗證的最佳方法是要求所有密鑰都必須存在,在這種情況下,「doc1」也是無效的。這是你想要的嗎? – styvane

+0

@ user3100115我需要兩個驗證器,第一種情況下doc1有效,第二種情況如您所述,但必須不存在額外的密鑰 – tpnsharma

回答

0

完成功能現在看看下面的功能可以幫助你: -

function validateReq(obj) 
{ 
    var prop = ['a','b','c'] //Add more property name here 
    var found = false; 
    for(var key in obj) 
    { 
    if (prop[key] && (prop[key] !== null)) 
    { 
     found = true; 
    } 
    else 
    { 
     return false; 
    } 
    } 
} 

調用此函數一樣var valid = validateReq(doc1);,在插入之前。

如果它是真的,即所有有效字段出現在您傳遞的對象中。現在你可以插入。否則對象中有一些無效的字段。

希望這會有所幫助!

0

隨着MongoDB的文檔驗證你可以表達下面的東西

  • 強制屬性(文件必須具有以下)
  • 禁止性(單據不得有這些,必須是具體的)
  • 可選屬性

驗證程序使用查詢,因此您只能明確定義禁止的屬性,但不限於「僅限這些」。在搜索時,您將使用不可用於驗證的投影。

強制性

一個是mandotry

db.runCommand({ 
    collMod: "example", 
    validator:{ $and : [ {a:{$exists:1}}] }, 
    validationLevel:"strict", 
    validationAction: "error" 
}) 

禁止

d禁止

db.runCommand({ 
    collMod: "example", 
    validator:{ $and : [ {b:{$exists:0}}] }, 
    validationLevel:"strict", 
    validationAction: "error" 
}) 

可選: 一個是強制性 b爲可選

db.runCommand({ 
    collMod: "example", 
    validator:{ 
    $and : [ 
    {a:{$exists:1}}, //mandatory 
    {d:{$exists:0}}, //forbidden 
    {$or:[ 
     {b:{$exists:1}}, //optional 
     {c:{$exists:1}}]} ] }, 
    validationLevel:"strict", 
    validationAction: "error" 
}) 

這將接受這些文檔

  • {A:1}
  • {A:1,B:1}
  • {a:1,c:1}
  • {a:1,b:1,c:1}
  • {a:1,b:1,e:1} fullfill驗證

這些文件是不能接受的

  • {一個:1,d:1} - > d禁止
  • {一個:1,E:1} - > B或C不服氣
  • {A:1,b:1,d:1} - > d禁止
+0

問題是存在無限的密鑰,所以我問有沒有什麼方法定義除了定義的鍵以外的所有東西都被禁止 – tpnsharma

+1

不,這不可能用於文檔驗證(這可能是您的問題的答案) –

0

實際上這是不可能的,只允許在文檔中給定的領域。但是你可以要求某些字段必須使用document validation功能MongoDB中3.2新和$and像這樣出現:

db.createCollection("collection", 
    { "validator": { 
     "$and": [   
      { "a": { "$exists": true } },   
      { "b": { "$exists": true } }, 
      { "c": { "$exists": true } } 
     ] 
    }} 
) 

而且,你不能插入或更新不符合您的驗證標準的文檔,除非你設置了validationLevel: "moderate"

我認爲如果MongoDB允許爲新文檔設置默認值,那將會很好。現在有一個新功能SERVER-24430的分配問題。

+0

但在這種情況下,如果任何文檔具有除a,b,c以外的其他鍵,則也驗證不需要的文件 – tpnsharma

+0

@tpnsharma這是不可能的,你將需要使用第三方工具。 – styvane

1

這是可能的,現在在蒙戈3.6使用JSON模式驗證,像這樣:

db.createCollection("myCollection", { 
    validator: { 
    $jsonSchema: { 
     bsonType: "object", 
     additionalProperties: false, 
     properties: { 
     _id: { 
      bsonType: 'objectId', 
     }, 
     a: { 
      bsonType: "string", 
     }, 
     b: { 
      bsonType: "string", 
     }, 
     } 
    } 
    } 
}); 

夫婦指出,可能會有所幫助:

  1. 你總是必須有_id條目使用時additionalProperties: false,否則每個文檔都會失敗驗證。
  2. 如果在模式中有嵌套對象,則每bsonType: "object"條目上需要additionalProperties: false,否則嵌套對象將允許其上的任何其他屬性。

文檔鏈接:

https://docs.mongodb.com/manual/core/schema-validation/ https://docs.mongodb.com/manual/reference/operator/query/jsonSchema/