gpt4 book ai didi

javascript - Mongoose 3.8 中的 ObjectId 数组

转载 作者:行者123 更新时间:2023-12-03 10:40:29 25 4
gpt4 key购买 nike

我有一个名为 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] 但它们都一直返回未定义。

最佳答案

您列出的代码没有任何问题,因此您没有向我们展示的代码导致了问题。

当您引用时,您将在集合中保存对象的副本,并将相关的 ObjectId 值添加到您的案例中“回复”中的对象数组中。

有多种方法可以做到这一点,但一个好的、安全的 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(),它将返回到集合并检索相关数据,并使数据看起来像是该项目也是如此。

请注意,如果没有您自己的干预,这种魔法不会“递归”发生。它只是一个基本的助手,所以如果您想要更多,那么您仍然需要自己进行提升。

关于javascript - Mongoose 3.8 中的 ObjectId 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28802125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com