首页 > 解决方案 > 从对象集合返回特定数组

问题描述

所以我将一些数据放入我的套接字客户端中的代码是:

useEffect(() => {  
    
    const socket = io("http://localhost:5000/api/socket");
    
    socket.on("newThought", (thought) => {
      console.log(thought);
    });
    
  }, []); 

然后我服务器中的代码是

connection.once("open", () => {
  console.log("MongoDB database connected");

  console.log("Setting change streams");
  const thoughtChangeStream = connection.collection("phonenumbers").watch();

  thoughtChangeStream.on("change", (change) => {
   
    io.of("/api/socket").emit("newThought", change);

  });
});

当我的“电话号码”集合中的某些内容发生变化时,我会得到整个集合的回报。我如何才能仅获取从集合中的对象更改的数组? 在此处输入图像描述 因此,例如,如果在集合中唯一更改的服务是 ID 为“607deefd13c4ebcbcfa0900a”的服务,它应该是唯一返回的服务,而不是整个集合对象。

标签: reactjsmongodbmongoosesocket.io

解决方案


fullDocument方法的选项(第二个)参数的参数watch可用于获取描述update操作文档更改的增量:

const thoughtChangeStream = connection.collection("phonenumbers").watch([], {
  fullDocument: 'updateLookup'
});

thoughtChangeStream.on("change", (change) => {
   
  io.of("/api/socket").emit("newThought", change);

});

然后这将返回一个像这样的响应文档,其中updateDescription包含更新修改的字段:

{
  _id: {
    _data: '8260931772000000012B022C0100296E5A1004ABFC09CB5798444C8126B1DBABB9859946645F696400646082EA7F05B619F0D586DA440004'
  },
  operationType: 'update',
  clusterTime: Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1620252530 },
  ns: { db: 'yourDatabase', coll: 'yourCollection' },
  documentKey: { _id: 6082ea7f05b619f0d586da44 },
  updateDescription: {
    updatedFields: { updatedField: 'newValue' },
    removedFields: []
  }
}

注意:这仅适用于update操作,不适用于replace, delete,insert等。

也可以看看:


推荐阅读