:bug: fix mongoose cache
1 files changed, 22 insertions, 7 deletions
diff --git a/src/util/Database.ts b/src/util/Database.ts
index 3a0f0157..1b77629f 100644
--- a/src/util/Database.ts
+++ b/src/util/Database.ts
@@ -52,9 +52,11 @@ export class MongooseCache extends EventEmitter {
public pipeline: Array<Record<string, unknown>>,
public opts: {
onlyEvents: boolean;
+ array?: boolean;
}
) {
super();
+ if (this.opts.array == null) this.opts.array = true;
}
init = async () => {
@@ -67,7 +69,8 @@ export class MongooseCache extends EventEmitter {
if (!this.opts.onlyEvents) {
const arr = await this.collection.aggregate(this.pipeline).toArray();
- this.data = arr.length ? arr[0] : arr;
+ if (this.opts.array) this.data = arr || [];
+ else this.data = arr?.[0];
}
};
@@ -90,23 +93,34 @@ export class MongooseCache extends EventEmitter {
change = (doc: ChangeEvent) => {
try {
- // @ts-ignore
- if (doc.fullDocument) {
- // @ts-ignore
- if (!this.opts.onlyEvents) this.data = doc.fullDocument;
- }
-
switch (doc.operationType) {
case "dropDatabase":
return this.destroy();
case "drop":
return this.destroy();
case "delete":
+ if (!this.opts.onlyEvents) {
+ if (this.opts.array) {
+ this.data = this.data.filter((x: any) => doc.documentKey?._id?.equals(x._id));
+ } else this.data = null;
+ }
return this.emit("delete", doc.documentKey._id.toHexString());
case "insert":
+ if (!this.opts.onlyEvents) {
+ if (this.opts.array) this.data.push(doc.fullDocument);
+ else this.data = doc.fullDocument;
+ }
return this.emit("insert", doc.fullDocument);
case "update":
case "replace":
+ if (!this.opts.onlyEvents) {
+ if (this.opts.array) {
+ const i = this.data.findIndex((x: any) => doc.fullDocument?._id?.equals(x._id));
+ if (i == -1) this.data.push(doc.fullDocument);
+ else this.data[i] = doc.fullDocument;
+ } else this.data = doc.fullDocument;
+ }
+
return this.emit("change", doc.fullDocument);
case "invalidate":
return this.destroy();
@@ -119,6 +133,7 @@ export class MongooseCache extends EventEmitter {
};
destroy = () => {
+ this.data = null;
this.stream?.off("change", this.change);
this.emit("close");
|