2016-10-18 18 views
0

データベースに、ドキュメントのバリデーションを適用するドキュメントがいくつかあります。これらの文書にはすべて文書が埋め込まれている場合があります。 SQL非NULLチェックの行に沿って単純な検証を適用することができます(これらは基本的に主キー制約を強制します)が、オプションの配列と埋め込みドキュメントに何らかの条件付き検証を適用したいとします。一例では、私はこのようになります文書を持って言うことができます:MongoDB配列と埋め込みドキュメントの条件付きバリデーション

{ 
    "date": <<insertion date>>, 
    "name" : <<the portfolio name>>, 
    "assets" : << amount of money we have to trade with>> 
} 

明らかに私は、すべての挿入時に存在し、その日付の名前と資産を確実にするために、この文書の検証を置くことができます。サブのこの配列に条件付きの検証を適用するために

{ 
    "date"  : <<insertion date>>, 
    "name"  : <<the portfolio name>>, 
    "assets" : << amount of money we have to trade with>> 
    "portfolio" : [ 
        { "stockName" : "IBM", 
        "pricePaid" : 155.39, 
        "sharesHeld" : 100 
        }, 
        { "stockName" : "Microsoft", 
        "pricePaid" : 57.22, 
        "sharesHeld" : 250 
        } 
       ] 
} 

ことが可能です:私は株式ポートフォリオを管理していますし、文書が将来のアップデートを持つことができることは、このような株の配列を表示するために、しかし、言うことができますドキュメント?ポートフォリオが存在しないことは有効ですが、配列内の各文書に「stockName」、「pricePaid」および「sharesHeld」という3つのフィールドが含まれている必要がある場合は有効です。代わりに、この上記の検証では

答えて

2

MongoShell

db.createCollection("collectionname", 
{ 
    validator: { 
    $or: [ 
     { 
     "portfolio": { 
      $exists: false 
     } 
     }, 
     { 
     $and: [ 
      { 
      "portfolio": { 
       $exists: true 
      } 
      }, 
      { 
      "portfolio.stockName": { 
       $type: "string", 
       $exists: true 
      } 
      }, 
      { 
      "portfolio.pricePaid": { 
       $type: "double", 
       $exists: true 
      } 
      }, 
      { 
      "portfolio.sharesHeld": { 
       $type: "double", 
       $exists: true 
      } 
      } 
     ] 
     } 
    ] 
    } 
}) 

あなたは、ポートフォリオの有無にかかわらず、文書を挿入することができます。

シェルでバリデータを実行した後、あなたはマングース

を使用して

db.collectionname.insert({ 
     "_id" : ObjectId("58061aac8812662c9ae1b479"), 
     "date" : ISODate("2016-10-18T12:50:52.372Z"), 
     "name" : "B", 
     "assets" : 200 
}) 


db.collectionname.insert({ 
     "_id" : ObjectId("58061ab48812662c9ae1b47a"), 
     "date" : ISODate("2016-10-18T12:51:00.747Z"), 
     "name" : "A", 
     "assets" : 100, 
     "portfolio" : [ 
       { 
         "stockName" : "Microsoft", 
         "pricePaid" : 57.22, 
         "sharesHeld" : 250 
       } 
     ] 
}) 


If we try to insert a document like this 

db.collectionname.insert({ 
    "date"  : new Date(), 
    "name"  : "A", 
    "assets" : 100, 
    "portfolio" : [ 
        { "stockName" : "IBM", 

        "sharesHeld" : 100 
        } 
       ] 
}) 

then we will get the below error message 
WriteResult({ 
     "nInserted" : 0, 
     "writeError" : { 
       "code" : 121, 
       "errmsg" : "Document failed validation" 
     } 
}) 

を、以下のデータを挿入することができますはい、それはあなたのシナリオに基づいて、行うことができますが、初期化する必要があるかもしれません親スキーマおよび子スキーマ。

以下は、マングースの子供(ポートフォリオ)スキーマのサンプルです。

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var portfolioSchema = new Schema({ 
    "stockName" : { type : String, required : true }, 
    "pricePaid" : { type : Number, required : true }, 
    "sharesHeld" : { type : Number, required : true }, 
} 

参考文献:

http://mongoosejs.com/docs/guide.html

http://mongoosejs.com/docs/subdocs.html

Can I require an attribute to be set in a mongodb collection? (not null)

それが役に立てば幸い!

+0

MongoDBではなくMongoDBを直接使用しているので、私はあなたの解説を理解していません(私はMongooseが何であるかはわかりませんが)。私はコレクションに挿入されたすべてのドキュメントが有効になるようにmongoデータベースを設定します。私の場合、私は文書を挿入する人を支配していない文書を確実に行う必要があります。 –

+0

@RichardB - 更新された答えを見てください、私はあなたのシナリオのためのmongoシェル検証を与えました。 –

+0

そのクレメントに感謝します。あなたはそれが明白に見えるようにそれを表現すると、なぜ私はそれを理解していないのか分かりません:) –

関連する問題