Clean up MongoDB query projection
This prevents potential 'path collision' errors from MongoDB.
This commit is contained in:
1 parent
adaf801d6e
commit
2b37f11e2e
3 files changed
+7
-3
No files matched your search
@@ -91,7 +91,9 @@ export async function disconnect(): Promise<void> {
|
|||||||
|
|
||||||
// Optimize projection by removing overlaps
|
// Optimize projection by removing overlaps
|
||||||
// This can modify the object
|
// This can modify the object
|
||||||
function optimizeProjection(obj: { [path: string]: 1 }): { [path: string]: 1 } {
|
export function optimizeProjection(obj: { [path: string]: 1 }): {
|
||||||
|
[path: string]: 1;
|
||||||
|
} {
|
||||||
if (obj[""]) return { "": obj[""] };
|
if (obj[""]) return { "": obj[""] };
|
||||||
|
|
||||||
const keys = Object.keys(obj).sort();
|
const keys = Object.keys(obj).sort();
|
||||||
|
|||||||
+2
-1
@@ -21,7 +21,7 @@ import * as url from "url";
|
|||||||
import { Collection, GridFSBucket, ObjectId } from "mongodb";
|
import { Collection, GridFSBucket, ObjectId } from "mongodb";
|
||||||
import * as vm from "vm";
|
import * as vm from "vm";
|
||||||
import * as config from "./config";
|
import * as config from "./config";
|
||||||
import { onConnect } from "./db";
|
import { onConnect, optimizeProjection } from "./db";
|
||||||
import * as query from "./query";
|
import * as query from "./query";
|
||||||
import * as apiFunctions from "./api-functions";
|
import * as apiFunctions from "./api-functions";
|
||||||
import { IncomingMessage, ServerResponse } from "http";
|
import { IncomingMessage, ServerResponse } from "http";
|
||||||
@@ -821,6 +821,7 @@ export function listener(
|
|||||||
projection = {};
|
projection = {};
|
||||||
for (const p of (urlParts.query.projection as string).split(","))
|
for (const p of (urlParts.query.projection as string).split(","))
|
||||||
projection[p.trim()] = 1;
|
projection[p.trim()] = 1;
|
||||||
|
projection = optimizeProjection(projection);
|
||||||
}
|
}
|
||||||
|
|
||||||
const cur = collection.find(q, { projection: projection });
|
const cur = collection.find(q, { projection: projection });
|
||||||
|
|||||||
+2
-1
@@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
import { Db, GridFSBucket, ObjectId } from "mongodb";
|
import { Db, GridFSBucket, ObjectId } from "mongodb";
|
||||||
import { Script } from "vm";
|
import { Script } from "vm";
|
||||||
import { onConnect } from "../db";
|
import { onConnect, optimizeProjection } from "../db";
|
||||||
import * as mongodbFunctions from "../mongodb-functions";
|
import * as mongodbFunctions from "../mongodb-functions";
|
||||||
import * as expression from "../common/expression";
|
import * as expression from "../common/expression";
|
||||||
import { QueryOptions, Expression } from "../types";
|
import { QueryOptions, Expression } from "../types";
|
||||||
@@ -89,6 +89,7 @@ export function query(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (resource === "presets") projection.configurations = 1;
|
if (resource === "presets") projection.configurations = 1;
|
||||||
|
projection = optimizeProjection(projection);
|
||||||
cursor.project(projection);
|
cursor.project(projection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user