数组types的mongodb字段在使用.push()时不会更新长度

以下是试图将用户添加到模式的代码:

var roomSchema = new Schema({ name: { type: String, required: true}, connections: { type: [ { userId: String } ] }, content: { type: String, default: ""}, isFull: { type: Boolean, default: false} }); roomSchema.methods.addUser = function(username, callback) { this.updateAsync( { $push: { connections: { userId: username } } } ) .then(function(status) { return this.saveAsync(); }) .catch(function(afterPushErr) { console.log('After push error'); throw afterPushErr; }) .catch(function(saveErr) { console.log('save Error'); throw saveErr; }); Promise.all(this.connections) .then(function() { if(this.connections.length >= 5) { this.updateAsync( { isFull: true }) .then(function(status) { return; }) .catch(function(updateErr) { console.log('update Error!'); throw updateErr; }); } }); } 

然后调用它的代码(正确地导入上面的函数):(注意:这只是一个快速testing函数,以确保每个房间最多只有5个用户)

 var populateRooms = function() { var names = [ 'asas', 'asas2', 'asas3', 'asas4', 'asas5', 'asas6']; var emails = [ 'asas@as.ca', 'asas2@as.ca', 'asas3@as.ca', 'asas4@as.ca', 'asas5@as.ca', 'asas6@as.ca']; for(var i=0; i<6; ++i) { Room.findOneAsync( { isFull: false }) .then(function(freeRoom) { var newUser = new User({ username : names[i], email : emails[i], password : 'Asasas1', isPlaced: true, roomName: freeRoom.name }); freeRoom.addUser(newUser.username); return newUser; }) .then(function(newUser) { newUser.saveAsync(); }) .catch(function(err) { throw err; }); } return true; } 

通常我在控制台中看到的只是被推送的最后一个用户,而不是整个列表,因此我无法查看列表的长度是否大于等于5。

在mongo控制台上,我看到了这个房间模式:

 { "_id" : ObjectId("5882c3eefab3081700444972"), "name" : "1484964846968_0", "isFull" : false, "content" : "", "connections" : [ { "userId" : "asas5", "_id" : ObjectId("5882c3effab308170044497f") }, { "userId" : "asas6", "_id" : ObjectId("5882c3effab308170044497d") }, { "userId" : "asas4", "_id" : ObjectId("5882c3effab3081700444981") }, { "userId" : "asas6", "_id" : ObjectId("5882c3effab308170044497d") }, { "userId" : "asas5", "_id" : ObjectId("5882c3effab308170044497f") }, { "userId" : "asas4", "_id" : ObjectId("5882c3effab3081700444981") }, { "userId" : "asas3", "_id" : ObjectId("5882c3effab3081700444983") }, { "userId" : "asas", "_id" : ObjectId("5882c3effab3081700444987") }, { "userId" : "asas2", "_id" : ObjectId("5882c3effab3081700444985") }, { "userId" : "asas3", "_id" : ObjectId("5882c3effab3081700444983") }, { "userId" : "asas2", "_id" : ObjectId("5882c3effab3081700444985") }, { "userId" : "asas", "_id" : ObjectId("5882c3effab3081700444987") } ], "__v" : 12 } { "_id" : ObjectId("5882c3eefab3081700444973"), "name" : "1484964846978_1", "isFull" : false, "content" : "", "connections" : [ ], "__v" : 0 } { "_id" : ObjectId("5882c3eefab3081700444974"), "name" : "1484964846980_2", "isFull" : false, "content" : "", "connections" : [ ], "__v" : 0 } { "_id" : ObjectId("5882c3eefab3081700444975"), "name" : "1484964846980_3", "isFull" : false, "content" : "", "connections" : [ ], "__v" : 0 } { "_id" : ObjectId("5882c3eefab3081700444976"), "name" : "1484964846981_4", "isFull" : false, "content" : "", "connections" : [ ], "__v" : 0 } { "_id" : ObjectId("5882c3eefab3081700444977"), "name" : "1484964846981_5", "isFull" : false, "content" : "", "connections" : [ ], "__v" : 0 } { "_id" : ObjectId("5882c3eefab3081700444978"), "name" : "1484964846982_6", "isFull" : false, "content" : "", "connections" : [ ], "__v" : 0 } { "_id" : ObjectId("5882c3eefab3081700444979"), "name" : "1484964846984_7", "isFull" : false, "content" : "", "connections" : [ ], "__v" : 0 } { "_id" : ObjectId("5882c3eefab308170044497a"), "name" : "1484964846984_8", "isFull" : false, "content" : "", "connections" : [ ], "__v" : 0 } { "_id" : ObjectId("5882c3eefab308170044497b"), "name" : "1484964846984_9", "isFull" : false, "content" : "", "connections" : [ ], "__v" : 0 } 

编辑这是addUser的承诺代码上的新错误

(节点:4648)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝标识:1):TypeError:无法读取未定义的属性“连接”(节点:4648)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝标识:2):TypeError:连接'未定义后推错误后推错误保存错误保存错误未处理的拒绝types错误:无法读取在C:\ someApp \应用程序\模型\ room-model.js:19:14在tryCatcher(C: \ someApp \ node_modules \蓝鸟\ JS \释放\ util.js中:16:23)

在testing函数中,您将asynchronous调用( Room.findOne )放在for循环中。 因此,每个循环都有相同的freeZoom (这不是你想要的)

检查这个问题: 一个javascript for循环内的asynchronous过程

另外一个build议, this.updateaddUser函数内也是asynchronous的,在某些情况下可能不像你想要的那样。