2016-10-18 4 views
0

Ich habe eine Reihe von Dokumenten in meiner Datenbank, in denen ich die Dokumentenvalidierung anwende. Alle diese Dokumente können eingebettete Dokumente enthalten. Ich kann eine einfache Validierung entlang der SQL-Non-NULL-Checks anwenden (diese erzwingen im Wesentlichen die Primärschlüssel-Constraints), aber ich möchte eine Art bedingte Validierung für die optionalen Arrays und eingebetteten Dokumente anwenden. Mit dem Beispiel können sagen, ich ein Dokument haben, das wie folgt aussieht:MongoDB Bedingte Validierung für Arrays und eingebettete Dokumente

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

Klar kann ich auf diesem Dokument stellen die Validierung dieses Datum Namen zu gewährleisten und alle Vermögenswerte an der Einführungszeit existieren. Hier kann jedoch sagen, dass ich ein Aktienportfolio bin die Verwaltung und das Dokument zukünftiges Updates eine Reihe von Aktien zu zeigen, wie diese haben kann: eine bedingte Validierung dieses Feld von Unter

{ 
    "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 
        } 
       ] 
} 

Ist es möglich, anzuwenden Unterlagen? Es ist für das Portfolio gültig, nicht dort zu sein, aber wenn jedes Dokument im Array die drei Felder "stockName", "pricePaid" und "sharesHeld" enthält.

Antwort

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 
      } 
      } 
     ] 
     } 
    ] 
    } 
}) 

Mit dieser oben Validierung anstelle von Dokumenten mit oder ohne Portfolio einfügen können.

Nach dem Validator in der Schale ausgeführt wird, dann können Sie Daten von folgenden einfügen

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" 
     } 
}) 

Mongoose Mit

Ja, es kann getan werden, Basierend auf Ihrem Szenario können Sie die initialisieren müssen Eltern- und Kindschema.

Darunter wäre ein Beispiel für Kind (Portfolio) Schema in Mungo.

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 }, 
} 

Referenzen:

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)

hoffe, es hilft!

+0

Ich bin mir nicht sicher, ob ich Ihren Kommentar verstehe, da ich MongoDB direkt benutze und nicht Mongoose (obwohl ich zugeben muss, dass ich nicht weiß, was Mongoose ist). Ich möchte, dass die Mongo-Datenbank so eingerichtet wird, dass alle in eine Sammlung eingefügten Dokumente validiert werden. In meinem Fall muss ich sicherstellen, dass dies bei Dokumenten geschieht, bei denen ich keine Kontrolle über die Person habe, die das Dokument einfügt. –

+0

@RichardB - Bitte sehen Sie die aktualisierte Antwort, ich habe Ihnen eine Mongo-Shell-Validierung für Ihr Szenario gegeben. –

+0

Danke für diesen Clement. Wenn man es so ausdrückt, sieht es offensichtlich aus und ich kann nicht verstehen, warum ich das nicht herausgefunden habe :) –

Verwandte Themen