Estoy tratando de usar c # para insertar cada nuevo subdocumento en una matriz en la posición superior usando la versión del controlador 2.4.2. En mongo, el siguiente comando funciona bien:

db.getCollection('Operation').update(
{_id: ObjectId('586e9ec5ab3d05173cd88957') }, 
{$push: {'location': {$each: [ { 'value' : 'Site', 'time' : ISODate('2017-02-24T16:05:44.204Z'), 'user' : 'user1' } ], $position: 0 } } }
)

Entonces el resultado es:

{
    "_id" : ObjectId("586e9ec5ab3d05173cd88957"),
    "location" : [ 
        {
            "value" : "Site",
            "time" : ISODate("2017-02-24T16:05:44.204Z"),
            "user" : "user1"
        }
    ]
}

Pero hasta ahora no logro obtener el mismo resultado en C #. Lo he intentado hasta ahora:

var filter = Builders<BsonDocument>.Filter.Eq("_id", ObjectId.Parse("586e9ec5ab3d05173cd88957"));
var update = Builders<BsonDocument>.Update.PushEach("location", new List<BsonArray>() { new BsonArray { new BsonDocument { { "value", "Site" }, { "time", DateTime.UtcNow }, { "user", "user1" } } } }, position: 0);
collection.UpdateOne(filter, update);

Y tampoco fue un éxito tratar de especificar todo en el texto:

collection.UpdateOne("{ '_id': ObjectId('586e9ec5ab3d05173cd88957') }", "{ '$push': {'location': { '$each': [ { 'value' : 'Site', 'time' : ISODate('2017-02-24T16:05:44.204Z'), 'user' : 'user1' } ], $position: 0 } } }"); 

¿Alguna sugerencia?

0
Jaap 19 mar. 2017 a las 23:35

2 respuestas

La mejor respuesta

Me tomó un tiempo debido a un error tipográfico. La respuesta del usuario1892538 fue correcta. Esto funciona:

var update = Builders<BsonDocument>.Update.PushEach("location", new BsonArray { new BsonDocument { { "value", "Site" }, { "time", DateTime.UtcNow }, { "user", "user1" } } }, position: 0);
0
Jaap 27 abr. 2017 a las 11:04

PushEach espera solo un parámetro BsonArray, no un List<BsonArray>.

Deberías estar haciendo algo como

var update = updateBuilder.PushEach("location", locationBSONArray); 

No es necesario serializar el documento bson.

0
19 mar. 2017 a las 21:58