2011-06-20 9 views
11

Mongo admite matrices de documentos dentro de documentos. Por ejemplo, algo así comoinserte en un índice específico para mongo array

{_id: 10, "coll": [1, 2, 3] } 

Ahora, imagino que quería para insertar un valor arbitrario en un índice arbitrario

{_id: 10, "coll": [1, {name: 'new val'}, 2, 3] } 

Sé que usted puede actualizar los valores en el lugar con $ y $ set, pero nada de inserción. es una mierda tener que reemplazar toda la matriz solo para insertarla en un índice específico.

Respuesta

16

a partir de la versión 2.6 que finalmente puede hacer esta. Tienes que usar el operador $position. Para su ejemplo particular:

db.students.update(
    { _id: 10}, 
    { $push: { 
    coll: { 
     $each: [ {name: 'new val'} ], 
     $position: 1 
    } 
    }} 
) 
+0

sin '$ each, $ position' no funciona –

0

En cuanto a su comentario:

Bueno .. con usuarios concurrentes esto va a ser problemático con cualquier base de datos ...

Lo que quiero hacer es la siguiente: Añadir una última fecha y hora modificada a la documento. Cargue el documento, permita que el usuario lo modifique y utilice timstamp como filtro cuando actualice el documento y también actualice la marca de tiempo en un solo paso. Si actualiza 0 documentos, usted sabe que fue modificado mientras tanto y puede pedirle al usuario que lo vuelva a cargar.

1

A continuación se hará el truco:

var insertPosition = 1; 
var newItem = {name: 'new val'}; 

db.myCollection.find({_id: 10}).forEach(function(item) 
{ 
    item.coll = item.coll.slice(0, insertPosition).concat(newItem, item.coll.slice(insertPosition)); 
    db.myCollection.save(item); 
}); 

Si el insertPosition es variable (es decir, que no saben exactamente donde desea insertarlo, pero ya se sabe que desea insertarlo después del artículo con name = "foo", basta con añadir un bucle for() antes de la asignación item.coll = para encontrar el insertPosition (y añadir 1 a la misma, ya que desea insertarlo DESPUÉS name = "foo".

0

Usando el operador $ position esto puede hacerse a partir de la versión 2.5.3.

Debe utilizarse con el operador $ each. De the documentation:

db.collection.update(<query>, 
        { $push: { 
           <field>: { 
             $each: [ <value1>, <value2>, ... ], 
             $position: <num> 
           } 
          } 
        } 
       ) 
1

respuesta práctico (no seleccionado respuesta, pero de mayor audiencia) de este puesto similar: Can you have mongo $push prepend instead of append?

utiliza $ configurar para insertar 3 en la primera posición en una matriz, llamada "matriz" . Ejemplo de respuesta relacionada por Sergey Nikitin:

db.test.update({"_id" : ObjectId("513ad0f8afdfe1e6736e49eb")}, 
       {'$set': {'array.-1':  3}}) 
Cuestiones relacionadas