Dada la siguiente estructura del documento MongoDB (que no puedo cambiar), no estoy seguro de cómo leer esto en JavaScript.

entonces loginHistory es el nombre del campo principal. Contiene un tipo de Object (¿de acuerdo?)
luego puede contener varios campos secundarios (este ejemplo anterior tiene solo UN elemento secundario), que son matrices. Estos nombres de campo son dinámicos, pero únicos.
el contenido de la 'matriz' es un C# DateTimeOffset , me han dicho.
Entonces, en el ejemplo anterior, Jane es el campo y el valor es Array , pero en realidad es DateTime.Offset .
Aquí hay otro documento que he encontrado:

Entonces no sé cómo leer esto con node/JavaScript. Ah, y el campo loginHistory podría no existir en algunos documentos, también :(
Entonces, dado el esquema/estructura del documento existente, necesito leer de alguna manera cada valor del historial de inicio de sesión y luego crear un nuevo documento (con el que haré otras cosas más adelante).
Este es un código JavaScript que probé, pero no funciona:
users.loginHistory.forEach(loginHistory => { // do stuff, like create a new { id = users._id, name = "Jane", createdOn = "that date/time offset" } }Suponiendo que tenemos un conjunto de entrada de documentos como las capturas de pantalla, por ejemplo:
var r = [ { loginHistory: { "Jane": [ 1648835363929, 0 ], "Bob": [ 1648835363929, 0 ] } }, { noLoginHistory: "nope" }, { loginHistory: { "Dan": [ 1648835363929, 0 ], "Dave": [ 1648835363929, 0 ], "Jane": [ 1648835363929, 0 ] } } ]; luego, la siguiente canalización creará nuevos documentos "convertidos" en una colección llamada foo2 .
db.foo.aggregate([ // OK if loginHistory does not exist. X will be set to null // and the $unwind will not produce anything: {$project: {X: {$objectToArray: "$$ROOT.loginHistory"} }}, {$unwind: "$X"}, // Now we have individual docs of // X: {k: name, v: the array} // The OP wanted to make a new doc for each one. I don't know // what function to apply to turn Xv[0] into a MongoDB datetime // because I don't know what that big int (637807576034080256) is // supposed to be so I used regular ms since epoch for the example // instead. The OP will have to get more creative with division // and such to turn 637807576034080256 into something "toDate-able" // in MongoDB. You *could* store the big int as is but it is always // good to try to turn a datetime into a real datetime in mongodb. {$project: { _id: false, name: '$X.k', createdOn: {$toDate: {$arrayElemAt:['$X.v',0]}} }} // Now we have docs like : // {name: "Jane", createdOn: ISODate(...) } // By calling $out to a new collection, a new _id will be assigned // to each: ,{$out: "foo2"} ]);