Tengo un DB llamado participantes con estructura:
{ _id: '123', infos: [ { myId: 'my123', otherId: 'other123' } ] }Sin embargo, StudyInfos puede estar vacío y los objetos dentro de StudyInfos pueden contener un myId sin otro Id. Quiero crear un índice único en
{ myId: 1, otherId: 1}Estoy usando sureIndex así:
Participants._ensureIndex( { 'infos.myId': 1, 'infos.otherId': 1 }, { unique: true, sparse: true, partialFilterExpression: { 'infos.otherId': { $exists: true, $type: String, $ne: null }, 'infos.myId': { $exists: true, $type: String, $ne: null }, }, }, );Sin embargo, cuando intento agregar un segundo usuario con información vacía o dos usuarios a los que les falta otro ID, falla debido a un índice duplicado. Básicamente, el único duplicado que no quiero es
{ _id: '123', infos: [ { myId: 'my123', otherId: 'other123' } ] }, { _id: '456', infos: [ { myId: 'my123', otherId: 'other123' } ] },Pero no está permitiendo:
{ _id: '123', infos: [] }, { _id: '456', infos: [] },o
{ _id: '123', infos: [ { myId: 'my123', } ] }, { _id: '456', infos: [ { myId: 'my123', } ] },ya sea a pesar de mi uso de sharedFilterExpression y sparse.
Ayuda.
Respondiendo a mi propia pregunta, eran dos cosas:
Respuesta final:
Participants.rawCollection().createIndex( { 'infos.myId': 1, 'infos.otherId': 1 }, { unique: true, partialFilterExpression: { 'infos.otherId': { $exists: true }, 'infos.myId': { $exists: true }, }, }, );