2016-07-04 2 views
2

Fügen Sie zuerst einen eindeutigen Index zum Feld 'items.barcode' hinzu.Hinzufügen eines eindeutigen Index zu einem Array-Typ-Feld beim Einbetten von Dokumenten von MongoDB

db.clothes.createIndex({'items.barcode': 1}, {unique: 1}); 

Dann legen Sie einige Dokumente an die clothes Tabelle.

db.clothes1.remove({}); 
db.clothes.insert([ 
    { // success 
     _id: '1', 
     items: [ 
      {barcode: ['122', '122']}, 
      {barcode: ['122', '124']} 
     ] 
    }, 
    { // success 
     _id: '2', 
     items: [ 
      {barcode: ['222', '223']}, 
      {barcode: ['224', '225']} 
     ] 
    }, 
    { // failed 
     _id: '3', 
     items: [ 
      {barcode: ['122', '323']}, 
      {barcode: ['324', '325']} 
     ] 
    } 
]); 

Jetzt können wir das dritte Dokument eingefügt ist fehlgeschlagen, verursachen den Fehler sehen:

'E11000 duplicate key error index: duolayimeng.clothes1.$items.barcode_1 dup key: { : "122" }'

Aber in den beiden einbetten Dokumente des ersten Dokuments, gibt es drei Elemente 'barcode' Feld sind '122'.


Ich bin verwirrt über diese Situation. Wie MongoDB entscheidet, ein Array-Typ Feld in Dokumente einbetten, wie 'items.barcode', ist einzigartig oder nicht?

Antwort

0

Das ist, weil ein Index über eine Sammlung von Dokumenten eindeutig ist.

Die Filialdokumente sind nicht wirklich Dokumente, ein Dokument ist gezwungen, ein eindeutiges Feld zu haben, ein Filialdokument kann nicht zwingend in einem Dokument eindeutig sein.

Dokument mit ID 3 schlägt fehl, da bereits ein anderes Dokument mit demselben eindeutigen Schlüssel existiert.

Dokumente mit ID 1 fügen OK ein, da kein anderes Dokument mit demselben eindeutigen Feld vorhanden ist.

Wenn Sie Einzigartigkeit innerhalb eines Dokuments erreichen wollen, müssen Sie, dass in der Client-Seite implementieren oder Schema ändern und Ihre Werte in einem Satz $addToSet

0

The unique index permits the insertion of the following document into the collection if no other document in the collection has the a.b value of 5:

db.collection.insert({ a: [ { b: 5 }, { b: 5 } ] }) 

Hier die doc

mit Add ist
Verwandte Themen