【问题标题】:Return the inserted sub-document返回插入的子文档
【发布时间】:2017-07-08 18:06:31
【问题描述】:

我正在构建一个应用程序,我需要在其中将消息添加为聊天室中的子文档。我需要在将子文档插入现有房间后立即返回子文档的数据。这是我的代码

  Room.findOne({ roomname: data.room }, (err, room) => {
    room.messages.push({ username: data.username, message: data.message });
    room.save((err, room) => {
      socket.broadcast.to(data.room).emit("new message", {
          username: room.messages.slice(-1).name,
          message: room.messages.slice(-1).message,
          createdat: room.messages.slice(-1).createdat
      });
    });
  });

所以这是我用来检索最后一个子文档的代码。有没有其他方法可以做到这一点?

【问题讨论】:

    标签: javascript node.js mongodb mongoose mongodb-query


    【解决方案1】:

    .findOneAndUpdate()$push 一起使用。这样,您只需“一次”触摸数据库,并且还避免了其他东西可能会修改文档并最终覆盖它的问题。这避免了.find() 然后.save() 模式的危险:

    Room.findOneAndUpdate(
      { roomname: data.room },
      { "$push": { 
        "messages": { username: data.username, message: data.message }
      }},
      { "new": true },
      (err, room) => {
        let message = room.messages.slice(-1)[0];
        socket.broadcast.to(data.room).emit(
          "new message",
          Object.keys(message).filter(k => k !== "_id")
            .reduce((acc,curr) => Object.assign(acc,{ [curr]: message[curr] }),{})
        );
      }
    );
    

    另外,只需.slice(-1)[0] 即可获取整个对象并将其返回,或者如上所示过滤掉不需要的键。

    或者甚至只是简单地返回数组元素中的所有字段和$slice从服务器查询返回的数组:

    Room.findOneAndUpdate(
      { roomname: data.room },
      { "$push": { 
        "messages": { username: data.username, message: data.message }
      }},
      { "new": true, "fields":  { "messages": { "$slice": -1 } } },
      (err, room) => {
        socket.broadcast.to(data.room).emit(
          "new message", room.messages[0]
        );
      }
    );
    

    【讨论】:

    • Lun 这给出了一个语法错误` SyntaxError: Unexpected token at **(**err, room) => {`
    • @TRomesh 让我想知道在哪里。第二个示例缺少}。已更正。适合我在这里输入而不是外部编辑器。
    【解决方案2】:
    room.messages.slice(-1).name
    

    这是不正确的,下面是演示

    [1,2,3].slice(-1)
    // returns [3], not 3
    

    你还是得用索引

    room.messages.slice(-1)[0].name
    // or simply 
    room.messages[room.messages.length - 1].name
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-07
      • 2023-04-05
      • 2021-10-03
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 2012-08-14
      相关资源
      最近更新 更多