2017-11-22 6 views
2

Mongodbのネイティブ検証ルールを思いついて、埋め込まれたドキュメントが存在する場合には存在しないか強制的に存在する1つ以上のフィールド。埋め込みドキュメントのMongodbネイティブ検証

私は以下の例があります。 JSONドキュメントには埋め込みドキュメントuserがあります。このuserが存在しないか、存在する場合は、必須フィールドにnameが必要です。

"validator" : { 
     "$or" : [ 
      { 
       "user" : { 
        "$exists" : "false", 
        "$type" : "null" 
       } 
      }, 
      { 
       "user.name" : { 
        "$type" : "string", 
        "$exists" : "true" 
       } 
      } 
      ] 
} 

そして、私はdb.testschema.insert({})のように私のコレクションtestschemaに空のJSON文書を挿入しようとすると、私が間違っているものを教えて、および/または、なぜしないの下に標準エラーを取得します。私の文書に埋め込み文書userとフィールドnameが含まれているか、埋め込まれた文書がまったく含まれていない可能性があります。

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

バリデーター内部で使用されている演算子が正しく見えていますか?

答えて

2

まず最初nulltruefalseが文字列として渡されるべきではない、文字列として渡されfalsetrueと評価されます。

ソリューション「$タイプ」の必要なし:ヌルバリ、単に「$が存在している」:偽はあなたのケースのために十分であるが、次の検証があなた

"validator" : { 
     "$or" : [ 
      { 
       "user" : { 
        "$exists" : false, 
       } 
      }, 
      { 
       "user.name" : { 
        "$type" : "string", 
        "$exists" : true 
       } 
      } 
      ] 
} 
+0

すごいのために働くだろう、それは私のとてもダムです! 'db.getCollectionInfos({name: 'testschema'})[0] .options.validator'コマンドを実行して、どのバリデーションルールが既に設定されているかを確認するとき、Mongoシェルはこれらのブール値をラップします二重引用符で囲まれた値!この素晴らしいチップをありがとう!とても有難い。 – asgs

+0

お手伝いします! – daemon24

関連する問題