Que vamos a tener una MongoDB colección que tiene tres docs..

db.de la colección.find()

 { _id:'...', user: 'A', title: 'Physics',   Bank: 'Bank_A' }
 { _id:'...', user: 'A', title: 'Chemistry', Bank: 'Bank_B' }
 { _id:'...', user: 'B', title: 'Chemistry', Bank: 'Bank_A' }

Tenemos un doc,

 doc = { user: 'B', title: 'Chemistry', Bank:'Bank_A' }

Si utilizamos

 db.collection.insert(doc) 

aquí, este duplicado doc va a insertarse en la base de datos.

 { _id:'...', user: 'A', title: 'Physics',   Bank: 'Bank_A' }
 { _id:'...', user: 'A', title: 'Chemistry', Bank: 'Bank_B' }
 { _id:'...', user: 'B', title: 'Chemistry', Bank: 'Bank_A' }
 { _id:'...', user: 'B', title: 'Chemistry', Bank: 'Bank_A' }

Cómo esta copia puede ser detenido. En el campo que se debe de indexación de hecho o de algún otro método?

InformationsquelleAutor shashank | 2014-06-09

3 Comentarios

  1. 49

    No utilice insertar.

    Uso actualización con upsert=true. Actualización buscar el documento que coincida con su consulta, a continuación, se va a modificar los campos que desee y, a continuación, se puede decir que upsert:True si desea insertar si no hay ningún documento coincide con su consulta.

    db.collection.update(
       <query>,
       <update>,
      {
        upsert: <boolean>,
         multi: <boolean>,
        writeConcern: <document>
       }
      )

    Así, por su ejemplo, usted podría usar algo como esto:

    db.collection.update(doc, doc, {upsert:true})
    • Ser conscientes de que upsert puede ser peligroso si usted espera ser cebado de un documento para el primer uso, ya que estará feliz de borrar cualquier cosa que se almacena allí, en favor de la upserted valores. El patrón que John P. propuesto es una mejor respuesta general para evitar registros duplicados, aunque cualquiera de los dos enfoques serían adecuados para el caso sencillo en el que se presentó donde el compuesto clave sería incluir todos los campos de los documentos. Si consideras que muy habitualmente se necesita la adición de una «hora de creación» para el registro, se puede ver cómo este se rompe muchos casos generales…
  2. 28

    Usted debe utilizar un compuesto índice en el conjunto de campos que identifican de forma única un documento dentro de su MongoDB colección. Por ejemplo, si usted decide que la combinación de usuario, el título y el Banco son su clave única utilizaría el siguiente comando:

    db.collection.createIndex( { user: 1, title: 1, Bank: 1 }, {unique:true} )

    Por favor, tenga en cuenta que esto debe hacerse después de haber retirado previamente almacenada duplicados.

    http://docs.mongodb.org/manual/tutorial/create-a-compound-index/

    http://docs.mongodb.org/manual/tutorial/create-a-unique-index/

    • no .ensureIndex… es .createIndex
    • ensureIndex crea el índice si no existe ya
    • Oh, tienes razón @Azmisov, pero ensureIndex en realidad estaba en desuso desde 3.0, ahora es un (obsoleto) alias para createIndex, como 3.0 no existía cuando esta respuesta se creó estoy quitando mi downvote 🙂 (no me permite deshacer mi downvote hasta que la respuesta está editado, esperemos Juan Petrone agrega como una actualización…
  3. 5

    Se ha actualizado a partir de las respuestas anteriores.

    por favor utilice db.collection.updateOne() en lugar de db.collection.update().
    y también db.collection.createIndexes() en lugar de db.collection.ensureIndex()

    Actualización:
    los métodos update() y ensureIndex() ha quedado obsoleta de mongodb 2.*, usted puede ver más detalles en mongo y la ruta de acceso es ./mongodb/lib/collection.js.
    Para update(), la recomiendo son los métodos de updateOne, updateMany, or bulkWrite.
    Para ensureIndex(), la recomendamos el método es createIndexes.

    • ¿Por qué debería de estas opciones de ser preferido? Sírvanse explicar su respuesta.
    • tan lejos como puedo ver, por update, sólo rediseñado el objeto de respuesta.

Dejar respuesta

Please enter your comment!
Please enter your name here