node.js - 如何使用 nodejs 插入和更新数据库中的现有数据?
问题描述
我已经创建了消息模式和对话模式。我无法理解为什么我无法将数据存储在 mongodb 中。
消息模式.js:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
// Create Schema
const MessageSchema = new Schema({
author: {
type: String,
required: true,
},
message: {
type: String,
required: true
},
date: {
type: Date,
default: Date.now
}
});
module.exports = mongoose.model('Message', MessageSchema);
对话模式.js:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
// Create Schema
const ConversationSchema = new Schema({
user1: {
type: String,
required: true
},
user2: {
type: String,
required: true
},
conversations : [{ type: Schema.Types.ObjectId, ref: 'Message' }]
});
module.exports = mongoose.model('Conversation', ConversationSchema);
server.js:
let db = mongoose.connection;
var user1, user2;
db.once('open', function() {
console.log("Database is now connected");
let io = socket(server);
io.on("connection", function(socket){
console.log("Socket Connection Established with ID :"+ socket.id)
socket.on('disconnect', function(){
console.log('User Disconnected');
});
let chat = db.collection('chat');
let conversation = db.collection('conversation');
socket.on('GET_USER', function (data) {
console.log(data);
user1 = data.user2;
});
socket.on('LOGGEDIN_USER', function(data) {
console.log(data);
user2 = data.user1;
});
socket.on('SEND_MESSAGE', function(data){
let author = data.author;
let message = data.message;
let date = data.date;
// Check for name and message
if(author !== '' || message !== '' || date !== ''){
// Insert message
chat.insert({author:author, message: message, date:date}, function(){
io.emit('RECEIVE_MESSAGE', [data]);
});
conversation.findOneAndUpdate(
{ user1 : user1, user2: user2 },
{ conversations : { $push : { author, message, date } } },
{ upsert : true}
);
}
});
在 server.js 中,我想在对话中添加消息(对话是一个数组)和 user1 和 user2(user1,user2 是字符串)在对话集合中。因此,如果未在 user1 和 user2 之间创建对话,则创建新对话并将其存储在集合中。如果之前的聊天存在,即会话中存在消息,那么只需将消息推送到会话数组中。我已经在上面的 server.js 中实现了它,但是文档没有被插入到对话集合中。文档仅添加聊天集合。
解决方案
您使用的findOneAndUpdate
功能不正确。第二个论点是不正确的。请查看 mongoDB 文档 ( db.collection.findOneAndUpdate
) 以阅读如何正确使用它。在那里,你可以找到
参数: update 类型: document
描述:要应用的修改。使用更新运算符,例如$set
、$unset
或$rename
。使用 field: value 的 update() 模式更新参数会引发错误。
conversation.findOneAndUpdate(
{ user1 : user1, user2: user2 },
{ conversations : { $push : { author, message, date } } }, // <<---- not OK
{ upsert : true}
);
您需要$set
在第二个参数处使用:
{ $set: <your object> }
推荐阅读
- html - Chrome 中的 100% viewidth (vw) 不起作用?
- html - 引导图像卡在屏幕顶部
- javascript - 使用变量和对象从对象中获取键的值
- javascript - 如何从选择下拉列表中调用选项
- azure-functions - 在 Azure Functions 绑定中,是否有任何方法可以根据相对于今天的日期查询 Cosmos DB 中的文档?
- java - 如何让 Android Studio 的 Java 编译器识别 Kotlin 类?
- database - 登台服务器的生产数据库克隆
- java - 将已完成程序的结果(在控制台上)打印到文本文件中?
- c# - 从 ASP.NET Core Web API 中的控制器访问用户身份
- excel - 在数组公式中计算具有多个参数的行