从对象集合返回特定数组
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
操作,不适用于replace
、delete
、insert
等。
另请参阅:
http://mongodb.github.io/node-mongodb-native/3.0/api/Collection.html。 https://docs.mongodb.com/manual/reference/change-events/【讨论】:
不幸的是,我看不到任何描述更改的增量。那会在哪里?以上是关于从对象集合返回特定数组的主要内容,如果未能解决你的问题,请参考以下文章