对于模型“users”Mongoose Mongodb,在path“_id”上投射为数值“XXX”失败

我遇到了两个不同型号的问题。 UserPlayer 。 每个对象都有一个ObjectId存储。 当我尝试从User模型中find以下populate时,会发生我的错误。

User.find().populate('player_id')

具有Player_id的用户数据

 > db.getCollection('users').find({}); { "_id" : ObjectId("58ea512576f3381d0cdf39a7"), "key" : "c7c7d3611f3d856f7a75eae5303e1cdf", "player_id" : ObjectId("59b3bff9605cbf7610c15837") } 

玩家数据

 > db.getCollection('players').find(); { "_id" : ObjectId("59b3bff9605cbf7610c15837"), "user_id" : ObjectId("58ea512576f3381d0cdf39a7") } 

用户模型

 var UserSchema = new Schema({ name: String, player_id: {type: Schema.ObjectId, ref: "Player", default: null} }) 

玩家模型

 var Player = new Schema({ fname : String, sname : String, user_id: {type: Schema.ObjectId, ref: "User", default: null}, }); 

完整的错误消息

 { CastError: Cast to number failed for value "59b3bff9605cbf7610c15837" at path "_id" at CastError (/var/www/norsemenfc.co.uk/node_modules/mongoose/lib/error/cast.js:27:11) at SchemaNumber.cast (/var/www/norsemenfc.co.uk/node_modules/mongoose/lib/schema/number.js:231:9) at SchemaNumber.SchemaType._castForQuery (/var/www/norsemenfc.co.uk/node_modules/mongoose/lib/schematype.js:1064:15) at SchemaNumber.castForQuery (/var/www/norsemenfc.co.uk/node_modules/mongoose/lib/schema/number.js:282:14) at /var/www/norsemenfc.co.uk/node_modules/mongoose/lib/schematype.js:991:18 at Array.map (<anonymous>) at SchemaNumber.handleArray (/var/www/norsemenfc.co.uk/node_modules/mongoose/lib/schematype.js:990:14) at SchemaNumber.castForQuery (/var/www/norsemenfc.co.uk/node_modules/mongoose/lib/schema/number.js:280:20) at SchemaNumber.SchemaType.castForQueryWrapper (/var/www/norsemenfc.co.uk/node_modules/mongoose/lib/schematype.js:1016:17) at cast (/var/www/norsemenfc.co.uk/node_modules/mongoose/lib/cast.js:250:39) at model.Query.Query.cast (/var/www/norsemenfc.co.uk/node_modules/mongoose/lib/query.js:3109:12) at model.Query.Query._castConditions (/var/www/norsemenfc.co.uk/node_modules/mongoose/lib/query.js:1145:10) at model.Query.Query._find (/var/www/norsemenfc.co.uk/node_modules/mongoose/lib/query.js:1160:8) at /var/www/norsemenfc.co.uk/node_modules/kareem/index.js:250:8 at /var/www/norsemenfc.co.uk/node_modules/kareem/index.js:23:7 at _combinedTickCallback (internal/process/next_tick.js:131:7) at process._tickCallback (internal/process/next_tick.js:180:9) message: 'Cast to number failed for value "59b3bff9605cbf7610c15837" at path "_id" for model "users"', name: 'CastError', stringValue: '"59b3bff9605cbf7610c15837"', kind: 'number', value: 59b3bff9605cbf7610c15837, path: '_id', reason: undefined, 

[编辑]

查询来呼叫用户

 var mongoose = require('mongoose') User = mongoose.model('User'), Player = mongoose.model('Player'); module.exports = { getAll: function(passData){ return User.find().populate('player_id') //Point where failure happens .then(function(data){ passData.userDetails = data; return passData; }); }, 

如何保存ObjectId

所以我喜欢使用mongoose.Types.ObjectId来确保,但即使我把它存储为一个string,我不认为这应该发生。

  updateUserId: function (req, res) { var player_id = req.body.user,//string user_email = req.body.savePlayer; //string res.setHeader('Content-Type', 'application/json'); return User.find({ email: user_email }).exec({}) .then(function(data){ var user_id = data[0]._id; //ObjectId User.update({email: user_email}, {player_id: mongoose.Types.ObjectId((player_id))}, function (err) { if(err) res.send(JSON.stringify({status: 0})); Player.update({_id: player_id}, {user_id: user_id}, function (err) { if(err) { res.send(JSON.stringify({status: 0})); }else{ res.send(JSON.stringify({ status: 1 })); } }) }) }); } 

编辑2

路线

  home: function (req, res) { var passData = {}; api.getAll(passData) .then(api.getPlayersWithoutAUser) .then(function (passData) { res.render('admin/users', { user: req.user, title: 'Admin Users', selectedAdminMenu: 'users', passData: passData }); }) .catch(function (err) { console.error(err); }); }, 

我正在使用Mongoose ^4.11.11