gpt4 book ai didi

javascript - 多次订阅时出现重复数据

转载 作者:行者123 更新时间:2023-12-03 07:25:25 24 4
gpt4 key购买 nike

我在meteor中使用MongoDB聚合。多次订阅时出现重复数据。

(数据库中的数据是静态的,这意味着它们始终相同。)

//服务器端

Meteor.publish('totalNumber', function () {
let pipeline = [
{ $unwind: '$product' },
{ $group: {
_id: {
code: '$product.code',
hour: { $hour: '$timestamp' }
},
total: { $sum: '$product.count' },
}}
];

Products.aggregate(
pipeline,
Meteor.bindEnvironment((err, result) => {
console.log('result', result); // at here every time subscribe, no duplicated data
_.each(result, r => {
this.added('totalNumber',
// I use Random.id() here, because "Meteor does not currently support objects other than ObjectID as ids"
Random.id(), {
code: r._id.code,
hour: r._id.hour,
total: r.total
});
});
}
)
);

this.ready();
});

//客户端

this.subscribe('totalNumber', () => {
// Correct result: [Object, Object] for example
console.log(Products.find().fetch());
}, true);

this.subscribe('totalNumber', () => {
// Wrong result: [Object, Object, Object, Object]
console.log(Products.find().fetch());
}, true);

this.subscribe('totalNumber', () => {
// Wrong result: [Object, Object, Object, Object, Object, Object]
console.log(Products.find().fetch());
}, true);

所以现在基本上,新结果总是包含上次订阅的数据。

如何解决这个问题?谢谢

最佳答案

问题是您每次调用 added 时都使用随机 ID,因此客户端始终认为所有文档都是唯一的。您需要设计一个一致 id 字符串生成器。使用 this question 的答案,您可以想象构建一组如下所示的函数:

hashCode = function (s) {
return s.split('').reduce(function (a, b) {
a = ((a << 5) - a) + b.charCodeAt(0);return a & a;
}, 0);
};

objectToHash = function (obj) {
return String(hashCode(JSON.stringify(obj)));
};

因此,如果您想要为 codehour 的每个组合创建一个唯一的文档,您可以这样做:

var id = objectToHash(r._id);
this.added('totalNumber', id, {...});

关于javascript - 多次订阅时出现重复数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36023747/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com