Tengo el siguiente documento en mi base de datos:
{ "_id": ObjectId("ABCDEFG12345"), "options" : { "foo": "bar", "another": "something" }, "date" : { "created": 1234567890, "updated": 0 } } Y quiero actualizar options.foo y date.updated al mismo tiempo usando la notación de puntos, así:
var mongojs = require('mongojs'); var optionName = 'foo'; var optionValue = 'baz'; var updates = {}; updates['options.' + optionName] = optionValue; updates['date.updated'] = new Date().getTime(); db.myCollection.findAndModify({ query : { _id : ObjectId('ABCDEFG12345') }, update : { $set : updates }, upsert : false, new : true }, function(error, doc, result) { console.log(doc.options); console.log(doc.date); });Y esto da como resultado:
{ foo : 'baz', another : 'something' } { updated : 1234567890 } Específicamente, mi campo date.created preexistente está siendo golpeado a pesar de que estoy usando la notación de puntos.
¿Por qué esto solo funciona parcialmente? El subdocumento de options conserva sus datos preexistentes ( options.another ), ¿por qué el subdocumento de date no conserva sus datos preexistentes?
El comportamiento descrito generalmente ocurre cuando el objeto pasado en el operador $set tiene la forma { "data" : { "updated" : 1234567890 } } en lugar de { "data.updated" : 1234567890 } , pero no estoy familiarizado con puntos en JavaScript suficientes para saber si esa podría ser la causa del lado de JS.
Además, no explicaría por qué sucede con data y no con las options .
Si pudiera imprimir el objeto almacenado en las updates de variables y que se envía a MongoDB en el campo de update , eso permitiría saber de qué lado está el problema (JS o MongoDB).
Paso su código a un entorno de prueba y uso la misma biblioteca que está usando. La biblioteca mongojs, para consultas por ObjectId nativo es así mongojs.ObjectId("####") Puede consultar la documentación oficial .
para la función de devolución de llamada en la función findAndModify, el parámetro docs es una matriz, así que navego como una matriz 
Nota: [para concatenar la cadena, uso literales de plantilla] ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals )
Todo funciona bien...