从对象集合返回特定数组

Posted

技术标签:

【中文标题】从对象集合返回特定数组【英文标题】:Return specific array from object collection 【发布时间】:2021-07-28 00:42:48 【问题描述】:

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

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”的服务,则应该是唯一返回的服务,而不是整个集合对象。

【问题讨论】:

输出看起来不像从更改事件返回的数据的正确格式。它应该只返回已更改的文档。请参阅此处的最后一个代码示例输出:docs.mongodb.com/drivers/node/usage-examples/changeStream。 change.fullDocument 应包含已更改的文档。 在我的示例中,它包含已更改的文档。但是您可以在图像中看到我有一个对象和很多数组。我只想获取已更改的特定数组,而不是完整对象。 您是否将所有电话号码都存储在一个文档中?你能发布你的 React 代码吗? 是的,所有电话号码都在一个文档中。以及您希望看到哪些反应代码? 如果您将所有电话号码都放在一个文档中,这就是您看到所有电话号码的原因,所以我不确定您如何判断哪个号码已更改。是否可以将它们存储在单独的文档中? 【参考方案1】:

watch 方法的选项(第二个)参数的fullDocument 参数可用于获取描述对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 操作,不适用于replacedeleteinsert 等。

另请参阅:

http://mongodb.github.io/node-mongodb-native/3.0/api/Collection.html。 https://docs.mongodb.com/manual/reference/change-events/

【讨论】:

不幸的是,我看不到任何描述更改的增量。那会在哪里?

以上是关于从对象集合返回特定数组的主要内容,如果未能解决你的问题,请参考以下文章

PHP算法从单个集合中生成特定大小的所有组合

将新对象插入特定数组索引

Object.keys() 从集合中返回 MongoDB 对象上的意外键 [重复]

php 通过特定键/属性索引数组/对象的集合。

Laravel 集合 - 返回对象数组

使用集合循环遍历数组