La consulta de Mongo (con operador posicional) no funciona en mongoose

Dada una colección de base de datos con huertos, un objeto se parece a esto:

{ "orchardId" : ObjectId("5391c137722b051908000000"), "trees" : [ { "name" : "apple", "fruits" : [] }, { "name" : "pear", "fruits" : [ ObjectId("54c54291d93236150f00004e"), ObjectId("54c542c9d93236150f000062") ] } ] } 

Quiero agregar dinámicamente una fruta a un árbol específico. Sé que puedo hacer esto en mongo con:

 db.orchards.update( ({"orchardId": ObjectId("5391c137722b051908000000")}, {"trees" : { $elemMatch: {"name":"apple"}}}), { $push: { "trees.$.fruits": ObjectId("54c542c9d900000000001234") }} ) 

Así que, si tengo razón, esto debería ser esto en mongoose:

 orchards.update( ({"orchardId": ObjectId.fromString(orchard.id)}, {"trees" : {$elemMatch: {"name": "apple"}}}), {$push: {"trees.$.fruits": ObjectId("54c542c9d900000000001234") }},function(err, data){ ... 

Pero luego aparece un error que dice: [TypeError: No se puede llamar al método ‘ruta’ de indefinido]

Parece que la mongoose no puede manejar el operador posicional (el $ ) porque cuando cambio el $ con un 0, funciona.

¿Cómo hago este trabajo en mongoose?

En su ejemplo de código, tiene parens donde debe tener llaves, por lo que debería ser así en su lugar:

 orchards.update({ "orchardId": ObjectId(orchard.id), "trees": {$elemMatch: {"name": "apple"}} }, {$push: {"trees.$.fruits": ObjectId("54c542c9d900000000001234") }}, function(err, data){ ...