Estoy teniendo el siguiente código:

              var objectid = infos[i].id;
              var name = infos[i].name;
              return collection.aggregate([
                {$match: {app: new ObjectId(objectid)}},
                {$group: {_id: "$uid", amt: {$sum: 1}}}
              ])

Anteriormente, este código funcionaba bien, pero recientemente comencé a obtener el siguiente seguimiento de pila en velas:

error: TypeError: Argument must be a string
    at TypeError (native)
    at Buffer.write (buffer.js:791:21)
    at serializeObjectId (/Users/user/git/pivot/code/node_modules/sails-mongo/node_modules/bson/lib/bson/parser/serializer.js:242:10)
    at serializeInto (/Users/user/git/pivot/code/node_modules/sails-mongo/node_modules/bson/lib/bson/parser/serializer.js:699:17)
    at serializeObject (/Users/user/git/pivot/code/node_modules/sails-mongo/node_modules/bson/lib/bson/parser/serializer.js:280:18)
    at serializeInto (/Users/user/git/pivot/code/node_modules/sails-mongo/node_modules/bson/lib/bson/parser/serializer.js:705:17)
    at serializeObject (/Users/user/git/pivot/code/node_modules/sails-mongo/node_modules/bson/lib/bson/parser/serializer.js:280:18)
    at serializeInto (/Users/user/git/pivot/code/node_modules/sails-mongo/node_modules/bson/lib/bson/parser/serializer.js:551:17)
    at serializeObject (/Users/user/git/pivot/code/node_modules/sails-mongo/node_modules/bson/lib/bson/parser/serializer.js:280:18)
    at serializeInto (/Users/user/git/pivot/code/node_modules/sails-mongo/node_modules/bson/lib/bson/parser/serializer.js:705:17)
    at serialize (/Users/user/git/pivot/code/node_modules/sails-mongo/node_modules/bson/lib/bson/bson.js:47:27)

Se queja por el ObjectId que importé así:

var ObjectId = require('mongodb').ObjectID;

Como dije antes, esto estaba funcionando bien, pero ya no. Estoy realmente confundido. Si pongo objectId como una cadena, no devolverá ningún resultado. Si lo dejo como está (como estaba funcionando antes) arroja excepciones. Cuál es el problema aquí?

He leído lo siguiente:

https://docs.mongodb.com/v3.0/reference/operator/aggregation/cmp/#exp._S_cmp

Puedo hacer esto en robomongo:

 db.getCollection("openevent").aggregate([
                {$match: {app: new ObjectId(OBJECT_ID) }},
                {$group: {_id: "$uid", amt: {$sum: 1}}}
              ])

Usando los mismos valores que arriba. ¿¿Qué estoy haciendo mal??

Veo lo siguiente para sails-mongo:

└─┬ sails-mongo@0.12.1
  └─┬ mongodb@2.1.6
    └── mongodb-core@1.3.1
7
KVISH 27 jul. 2016 a las 07:04

2 respuestas

La mejor respuesta

Por el bien de la posteridad, esto suele deberse a problemas de compatibilidad entre versiones de mongo. El controlador 2.2 de MongoDB usa mongodb-core 2.0 (y bson 0.5) mientras que el controlador 2.1 de MongoDB usa mongodb-core 1.3 y bson 0.4. Si intenta utilizar un controlador MongoDB 2.1 ObjectId con el controlador MongoDB 2.2 obtendrá este error.

8
vkarpov15 12 nov. 2016 a las 01:39

No tengo idea de por qué esto es siquiera una respuesta, pero la publicaré.

Anteriormente tuve esto:

var ObjectId = require('mongodb').ObjectID;

Cambié a esto:

var ObjectId = require('sails-mongo/node_modules/mongodb').ObjectID;

Y de alguna manera eso marcó la diferencia.

12
KVISH 14 dic. 2017 a las 18:31