Clean up MongoDB query projection

This prevents potential 'path collision' errors from MongoDB.
This commit is contained in:
Zaid Abdulla committed 2022-02-17 18:14:53 -08:00
1 parent adaf801d6e
commit 2b37f11e2e
3 files changed
+7 -3

No files matched your search

+3 -1
View File
@@ -91,7 +91,9 @@ export async function disconnect(): Promise<void> {
// Optimize projection by removing overlaps
// 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[""] };
const keys = Object.keys(obj).sort();
+2 -1
View File
@@ -21,7 +21,7 @@ import * as url from "url";
import { Collection, GridFSBucket, ObjectId } from "mongodb";
import * as vm from "vm";
import * as config from "./config";
import { onConnect } from "./db";
import { onConnect, optimizeProjection } from "./db";
import * as query from "./query";
import * as apiFunctions from "./api-functions";
import { IncomingMessage, ServerResponse } from "http";
@@ -821,6 +821,7 @@ export function listener(
projection = {};
for (const p of (urlParts.query.projection as string).split(","))
projection[p.trim()] = 1;
projection = optimizeProjection(projection);
}
const cur = collection.find(q, { projection: projection });
+2 -1
View File
@@ -19,7 +19,7 @@
import { Db, GridFSBucket, ObjectId } from "mongodb";
import { Script } from "vm";
import { onConnect } from "../db";
import { onConnect, optimizeProjection } from "../db";
import * as mongodbFunctions from "../mongodb-functions";
import * as expression from "../common/expression";
import { QueryOptions, Expression } from "../types";
@@ -89,6 +89,7 @@ export function query(
}
if (resource === "presets") projection.configurations = 1;
projection = optimizeProjection(projection);
cursor.project(projection);
}