我的查询是:
db.Room.find({}, function (err, rooms) {
if (!err) {
async.each(rooms, function (room, done) {
db.User.find({}, function (err, users) {
if (err) {
done(err)
} else {
room.users = users
room._name = room.name
done()
}
})
}, function (err) {
if (!err) {
socket.emit('read:rooms', rooms)
}
})
}
})
和架构是:
室:
var mongoose = require('mongoose')
var Schema = mongoose.Schema,
ObjectId = Schema.ObjectId;
var Room = new Schema({
name: String
});
module.exports = Room
用户:
var mongoose = require('mongoose')
var Schema = mongoose.Schema,
ObjectId = Schema.ObjectId;
var User = new Schema({
email: String
});
module.exports = User
但是在前端:
socket.on('read:rooms', function (rooms) {
$scope.rooms = rooms
})
但是rooms
没有users
属性,请帮助我
答案 0 :(得分:2)
这是因为Rooms
架构没有users
属性。
所以,有几种方法可以解决它。因为看起来好像你希望users
属性不是模式的一部分,而是客户端连接而不是在数据库上完成的工作(这是一个很好的!),我建议您在通过套接字发送数据时将数据转换为普通的旧JavaScript对象(无论如何都会发生这种情况,您只是提前做了一点)。
因此,当find
返回时,它实际上返回一个完全实现的MongooseJS模型对象。虽然您可以在对象实例上设置动态属性,但它们不属于"数据"对于模型,以便稍后将其序列化到客户端时,只有已记录的属性可用。
所以,这是我建议的一个例子:
db.Room.find({}, function (err, rooms) {
if (!err) {
var oRooms = [];
async.each(rooms, function (room, done) {
/* etc. your code */
} else {
var oRoom = room.toObject();
oRoom.users = users
oRoom._name = room.name
oRooms.push(oRoom);
done()
}
此技术将使用模型的toObject
functionality来返回JavaScript对象(而不是Mongoose模型)。这样,您可以对对象执行您喜欢的操作,包括动态添加新属性。
当然,稍后请确保将新的房间阵列发送给客户:
if (!err) {
socket.emit('read:rooms', oRooms)
}