对于模型“users”Mongoose Mongodb,在path“_id”上投射为数值“XXX”失败
我遇到了两个不同型号的问题。 User
和Player
。 每个对象都有一个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