无法将对象添加到文档内的 MongoDB 数组
Can't add object to MongoDB array inside a document
我正在为我的聊天应用程序构建一个 API,我编写了下面的端点以在 MongoDB 中保存新消息。
消息本身是一个数组。
正在使用 Postman 测试此端点 returns 响应中新创建的消息,但该消息未添加到我的消息数组中。
router.post('/:id/messages', async (request, response) => {
const chatMessage = new Message({
type: request.body.type,
body: request.body.body,
author: request.body.author
});
try {
const newMessage = await chatMessage.save({ $push: { chatMessage } });
response.status(201).json(newMessage);
} catch (error) {
response.status(400).json({ message: error.message });
}
});
这是我的消息 Mongoose 架构:
const mongoose = require('mongoose');
const messageSchema = new mongoose.Schema({
type: {
type: String
},
body: {
type: String
},
author: {
type: String
},
date: {
type: Date,
default: Date.now
}
});
module.exports = mongoose.model('Message', messageSchema);
关于我做错了什么的任何提示?
太感谢了! :-)
编辑_
Mongo DB Sample
根据 mongodb 文档 .save()
已弃用:https://docs.mongodb.com/manual/reference/method/db.collection.save/
您应该尝试 .update()
命令,如 $push
示例文档中所示:
https://docs.mongodb.com/manual/reference/operator/update/push/
您的架构和操作不匹配。
您正在使用 $push
用于将数据附加到数组。您的架构不包含任何数组。
如果您的 collection 包含作为文档的邮件,那么您应该改用 .insertOne
。
router.post('/:id/messages', async (request, response) => {
const chatMessage = {
type: request.body.type,
body: request.body.body,
author: request.body.author
}
try {
const newMessage = await chatMessage.insertOne(chatMessage);
response.status(201).json(newMessage);
} catch (error) {
response.status(400).json({ message: error.message });
}
})
newMessage
将包含创建的文档。请注意,此代码未经测试。
请进行以下更改:
聊天架构文件:
/** messages schema w.r.t. messages field in chat document */
const messageSchema = new mongoose.Schema({
type: {
type: String
},
body: {
type: String
},
author: {
type: String
},
date: {
type: Date,
default: Date.now
}
});
/** Actual chat schema */
const chatsSchema = new mongoose.Schema({
id: Number,
user1: String,
user2: String,
messages: [messageSchema]
});
function getChatsModel() {
if (mongoose.models && mongoose.models.chats) {
return mongoose.models.chats;
}
return mongoose.model('chats', chatsSchema, 'chats');
}
module.exports = getChatsModel();
代码:
/** Import chats model file here & also do require mongoose */
router.post('/:id/messages', async (request, response) => {
const chatMessage = {
messages: {
type: request.body.type,
body: request.body.body,
author: request.body.author
}
};
try {
const id = mongoose.Types.ObjectId(request.params.id);
const dbResp = await Chats.findOneAndUpdate({ "_id": id }, { $push: chatMessage }, { new: true }).lean(true);
if (dbResp) {
// dbResp will be entire updated document, we're just returning newly added message which is input.
response.status(201).json(chatMessage);
} else {
response.status(400).json({ message: 'Not able to update messages' });
}
} catch (error) {
response.status(500).json({ message: error.message });
}
});
我正在为我的聊天应用程序构建一个 API,我编写了下面的端点以在 MongoDB 中保存新消息。
消息本身是一个数组。
正在使用 Postman 测试此端点 returns 响应中新创建的消息,但该消息未添加到我的消息数组中。
router.post('/:id/messages', async (request, response) => {
const chatMessage = new Message({
type: request.body.type,
body: request.body.body,
author: request.body.author
});
try {
const newMessage = await chatMessage.save({ $push: { chatMessage } });
response.status(201).json(newMessage);
} catch (error) {
response.status(400).json({ message: error.message });
}
});
这是我的消息 Mongoose 架构:
const mongoose = require('mongoose');
const messageSchema = new mongoose.Schema({
type: {
type: String
},
body: {
type: String
},
author: {
type: String
},
date: {
type: Date,
default: Date.now
}
});
module.exports = mongoose.model('Message', messageSchema);
关于我做错了什么的任何提示? 太感谢了! :-)
编辑_ Mongo DB Sample
根据 mongodb 文档 .save()
已弃用:https://docs.mongodb.com/manual/reference/method/db.collection.save/
您应该尝试 .update()
命令,如 $push
示例文档中所示:
https://docs.mongodb.com/manual/reference/operator/update/push/
您的架构和操作不匹配。
您正在使用 $push
用于将数据附加到数组。您的架构不包含任何数组。
如果您的 collection 包含作为文档的邮件,那么您应该改用 .insertOne
。
router.post('/:id/messages', async (request, response) => {
const chatMessage = {
type: request.body.type,
body: request.body.body,
author: request.body.author
}
try {
const newMessage = await chatMessage.insertOne(chatMessage);
response.status(201).json(newMessage);
} catch (error) {
response.status(400).json({ message: error.message });
}
})
newMessage
将包含创建的文档。请注意,此代码未经测试。
请进行以下更改:
聊天架构文件:
/** messages schema w.r.t. messages field in chat document */
const messageSchema = new mongoose.Schema({
type: {
type: String
},
body: {
type: String
},
author: {
type: String
},
date: {
type: Date,
default: Date.now
}
});
/** Actual chat schema */
const chatsSchema = new mongoose.Schema({
id: Number,
user1: String,
user2: String,
messages: [messageSchema]
});
function getChatsModel() {
if (mongoose.models && mongoose.models.chats) {
return mongoose.models.chats;
}
return mongoose.model('chats', chatsSchema, 'chats');
}
module.exports = getChatsModel();
代码:
/** Import chats model file here & also do require mongoose */
router.post('/:id/messages', async (request, response) => {
const chatMessage = {
messages: {
type: request.body.type,
body: request.body.body,
author: request.body.author
}
};
try {
const id = mongoose.Types.ObjectId(request.params.id);
const dbResp = await Chats.findOneAndUpdate({ "_id": id }, { $push: chatMessage }, { new: true }).lean(true);
if (dbResp) {
// dbResp will be entire updated document, we're just returning newly added message which is input.
response.status(201).json(chatMessage);
} else {
response.status(400).json({ message: 'Not able to update messages' });
}
} catch (error) {
response.status(500).json({ message: error.message });
}
});