diff --git a/lib/db.ts b/lib/db.ts index 127ca02..bcf0c85 100644 --- a/lib/db.ts +++ b/lib/db.ts @@ -91,7 +91,9 @@ export async function disconnect(): Promise { // 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(); diff --git a/lib/nbi.ts b/lib/nbi.ts index ec1cc4f..099e4c6 100644 --- a/lib/nbi.ts +++ b/lib/nbi.ts @@ -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 }); diff --git a/lib/ui/db.ts b/lib/ui/db.ts index 17ba630..3805eb5 100644 --- a/lib/ui/db.ts +++ b/lib/ui/db.ts @@ -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); }