【问题标题】:Can't add object to MongoDB array inside a document无法将对象添加到文档内的 MongoDB 数组
【发布时间】:2019-12-22 16:00:07
【问题描述】:

我正在为我的聊天应用程序构建一个 API,并在下面编写了端点以在 MongoDB 中保存新消息。

消息本身是一个数组。

使用 Postman 测试此端点会在响应中返回新创建的消息,但该消息不会添加到我的消息数组中。

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

【问题讨论】:

  • :id 在那里做什么,你是在插入Message 集合还是任何其他集合?另外,您的架构中的数组在哪里?您能否将您想要插入的任何集合中的文档样本提供给我们以便更好地理解..
  • 感谢您的提问。我发现我的消息实际上已发布到我的数据库中。但是这个函数会打开一个新的集合——我不想要。我的数据库中的每个文档里面都有一个消息文档。这是我的信息应该去的地方。所以我认为定义消息的 url 就足够具体了。还有更多提示吗?
  • 您能否提供您的示例文档,那么您的意思是message :[] 位于其他集合的文档中吗? (并且消息是一个对象数组)?? Every document in my DB has a messages document inside --> 你这是什么意思?数据库将有收藏品,收藏品将有文件!所以你想要一个名为 message 的对象数组在哪个集合中,因为你不想要消息集合,那么消息应该进入一个集合的文档!
  • 请看我帖子末尾的图片。提供了我的数据库的外观
  • 这种情况下应该基于_id

标签: node.js mongodb express mongoose mongoose-schema


【解决方案1】:

请进行以下更改:

聊天架构文件:

/** 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 });
    }
});

【讨论】:

  • 太棒了!非常感谢您花时间解决我的问题。请有一个美好的一天:-)
【解决方案2】:

根据 mongodb 文档,.save() 已弃用:https://docs.mongodb.com/manual/reference/method/db.collection.save/

您应该尝试.update() 命令,如$push 示例文档中所示: https://docs.mongodb.com/manual/reference/operator/update/push/

【讨论】:

    【解决方案3】:

    您的架构和操作不匹配。

    您正在使用$push 用于将数据附加到数组。您的架构不包含任何数组。

    如果您的集合包含作为文档的消息,那么您应该改用.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 然后将包含创建的文档。请注意,此代码未经测试。

    【讨论】:

    • 嘿奥利弗。感谢您的帮助,但我收到了 chatMessage.insertOne is not a function
    猜你喜欢
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 2020-03-17
    相关资源
    最近更新 更多