2016-07-27 28 views
6

jestem mających następujący kod:Argument musi być ciągiem w nodejs

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

Wcześniej ten kod działa dobrze, ale ostatnio zacząłem się poniżej StackTrace w żagle:

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) 

to skarży powodu ObjectId które importowane tak:

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

jak powiedziałem wcześniej, to wagowo działa dobrze, ale już nie. Jestem bardzo zmieszany. Jeśli wstawię objectId jako ciąg znaków, nie zwróci on żadnych wyników. Jeśli zostawiam go w niezmienionym stanie (jak działało wcześniej), zgłasza wyjątki. Jaki jest problem?

mam przeczytać poniżej:

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

jestem w stanie to zrobić w robomongo:

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

Stosując te same wartości jak wyżej. Co ja robię źle??

widzę następujące dla sails-mongo:

└─┬ [email protected] 
    └─┬ [email protected]2.1.6 
    └── [email protected] 
+0

Wygląda na to, że spodziewa się znaleźć bufor. A co powiesz na "nowy ObjectId (nowy bufor (String (objectid)))"? – HeadCode

+0

Nie działa :('przekazany argument musi być pojedynczym ciągiem 12 bajtów lub ciągiem 24 znaków szesnastkowych' – KVISH

+0

Czy możesz console.log obiektu po pierwszym wierszu powyżej? – HeadCode

Odpowiedz

5

Dla dobra potomności, jest to zwykle spowodowane problemami ze zgodnością między wersjami Mongo. Sterownik MongoDB 2.2 używa mongodb-core 2.0 (i bson 0.5), podczas gdy sterownik MongoDB 2.1 używa mongodb-core 1.3 i bson 0.4. Jeśli spróbujesz użyć sterownika 2.1 MongoDB w wersji 2.1 ze sterownikiem MongoDB 2.2, otrzymasz ten błąd.

+0

TO JEST BARDZO POPRAWKA. –

11

nie mam pojęcia dlaczego tak jest nawet odpowiedź, ale będę go zakładać.

Wcześniej miałem to:

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

Zmieniłem do tego:

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

I jakoś, że wykonana cała różnica.

+0

jakoś tak też dla mnie działało, może to problem z wersją modułu mongodb? – lascort

+0

To także moje przypuszczenie. – KVISH

+3

Tak, mogę potwierdzić, że właśnie zainstalowałem wersję 2.1.17 'mongodb' i działa teraz – lascort