我有一个名为Message的模式,它有一个属性replies
,它们也是Message对象。我试图用mongoose定义它,但是replies
一直未定义返回。
var MessageSchema = new Schema({
sender: {
type: Schema.ObjectId,
ref: 'User'
},
replies: [{type:Schema.ObjectId, ref:'Message'}],
roomId: String,
sendTime: Date,
content: String,
parentId: Schema.ObjectId
});
我还尝试了replies: [MessageSchema]
和replies:[Schema.ObjectId]
,但所有这些都继续未定义。
答案 0 :(得分:1)
您列出的代码没有任何问题,因此您没有向我们展示导致问题的代码。
当您引用时,您将同时保存集合中的对象副本,并将相关的ObjectId值添加到" reply"中的对象数组中。在你的情况下。
有几种方法可以做到,但一个安全的MongoDB方法是使用$push
添加其他项目。
作为一个完整的例子:
var async = require('async'),
mongoose = require('mongoose'),
Schema = mongoose.Schema;
var userSchema = new Schema({
"name": String
});
var messageSchema = new Schema({
"sender": { "type": Schema.Types.ObjectId, "ref": "User" },
"replies": [{ "type": Schema.Types.ObjectId, "ref": "Message" }],
"roomId": String,
"sendTime": { "type": Date, "default": Date.now },
"content": String,
"parentId": Schema.Types.ObjectId
});
var Message = mongoose.model( "Message", messageSchema );
var User = mongoose.model( "User", userSchema );
mongoose.connect('mongodb://localhost/test');
async.waterfall(
[
// Clean up samples
function(callback) {
async.each(
[User,Message],
function(model,callback) {
model.remove({},callback);
},
callback
)
},
// Create user
function(callback) {
User.create({ "name": "Bill" },callback);
},
// Create a message
function(user,callback) {
Message.create({
"sender": user._id,
"roomId": "1",
"content": "message"
},function(err,message) {
callback(err,user,message);
});
},
// Create a reply
function(user,message,callback) {
Message.create({
"sender": user._id,
"roomId": "1",
"content": "reply",
"parentId": message._id
},callback);
},
// Save that reply on the parent
function(message,callback) {
Message.findByIdAndUpdate(
message.parentId,
{ "$push": { "replies": message._id } },
function(err,message) {
console.info( message );
callback(err);
}
);
},
// List that
function(callback) {
Message.find({},function(err,messages) {
if (err) callback(err);
console.log(
"All:\n%s",
JSON.stringify( messages, undefined, 4 )
);
callback();
});
}
],
function(err) {
if (err) throw err;
mongoose.disconnect();
}
);
输出:
{ _id: 54f3dff198a8c85306a2ef67,
sender: 54f3dff198a8c85306a2ef66,
roomId: '1',
content: 'message',
__v: 0,
sendTime: Mon Mar 02 2015 14:58:41 GMT+1100 (AEDT),
replies: [ 54f3dff198a8c85306a2ef68 ] }
All:
[
{
"_id": "54f3dff198a8c85306a2ef67",
"sender": "54f3dff198a8c85306a2ef66",
"roomId": "1",
"content": "message",
"__v": 0,
"sendTime": "2015-03-02T03:58:41.387Z",
"replies": [
"54f3dff198a8c85306a2ef68"
]
},
{
"_id": "54f3dff198a8c85306a2ef68",
"sender": "54f3dff198a8c85306a2ef66",
"roomId": "1",
"content": "reply",
"parentId": "54f3dff198a8c85306a2ef67",
"__v": 0,
"sendTime": "2015-03-02T03:58:41.393Z",
"replies": []
}
]
如果你在一条消息上打电话给.populate()
,那么这就是"回复"现在,它将返回到集合并检索相关数据,并使其看起来数据也是该项目的一部分。
请注意,不会发生这样的魔法,并且递归地#34;没有你自己的干预。它只是一个基本的帮手,所以如果你想要更多,那么你仍然需要自己完成提升。