2016-07-27 7 views
6

ich den folgenden Code habe:Argument muss ein String in NodeJS seine

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

Zuvor dieser Code funktioniert gut, aber vor kurzem begann ich die unten in stacktrace Segeln bekommen:

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) 

es beschwert sich wegen der ObjectId, die ich wie so importiert:

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

wie ich schon sagte, dies w wie funktioniert gut, aber nicht mehr. Ich bin wirklich verwirrt. Wenn ich objectId als eine Zeichenkette gebe, gibt es keine Ergebnisse zurück. Wenn ich es so belasse (wie es vorher funktionierte), werden Ausnahmen ausgelöst. Was ist das Problem hier?

Ich habe die unten lesen:

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

Ich bin der Lage, dies in robomongo zu tun:

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

wie oben die gleichen Werte verwenden. Was mache ich falsch??

Ich sehe die folgenden für sails-mongo:

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

Es sieht aus wie es erwartet, einen Puffer zu finden. Was ist mit 'new ObjectId (neuer Puffer (String (objectid))')? – HeadCode

+0

Funktioniert nicht :(Das übergebene Argument muss eine einzelne Zeichenfolge von 12 Byte oder eine Zeichenfolge von 24 Hexadezimalzeichen sein. – KVISH

+0

Können Sie console.log die Objekt-ID nach der ersten Zeile oben? – HeadCode

Antwort

5

Für die Nachwelt, dies ist in der Regel aufgrund von Kompatibilitätsproblemen zwischen Versionen von Mongo. MongoDB-Treiber 2.2 verwendet mongodb-core 2.0 (und bson 0.5), während MongoDB-Treiber 2.1 mongodb-core 1.3 und bson 0.4 verwendet. Wenn Sie versuchen, eine MongoDB-Treiber 2.1 ObjectId mit MongoDB-Treiber 2.2 zu verwenden, wird dieser Fehler angezeigt.

+0

DIES IST SEHR RICHTIG. –

11

Ich habe keine Ahnung, warum dies ist auch eine Antwort, aber ich werde es posten.

Vorher hatte ich dies:

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

ich dies geändert:

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

Und irgendwie das machte den Unterschied.

+0

irgendwie hat das auch für mich funktioniert, vielleicht ist es ein problem mit der version des mongodb-moduls? – lascort

+0

Das ist auch meine Vermutung. – KVISH

+3

yeah Ich kann das bestätigen, habe gerade die Version 2.1.17 von 'mongodb' installiert und es funktioniert jetzt – lascort