mongodb-rag-core
Version:
Common elements used by MongoDB Chatbot Framework components.
97 lines • 3.66 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeMongoDbPageStore = void 0;
const pageIdentity_1 = require("./pageIdentity");
const MongoDbDatabaseConnection_1 = require("../MongoDbDatabaseConnection");
/**
Data store for {@link Page} objects using MongoDB.
*/
function makeMongoDbPageStore({ connectionUri, databaseName, collectionName = "pages", }) {
const { db, drop, close } = (0, MongoDbDatabaseConnection_1.makeMongoDbDatabaseConnection)({
connectionUri,
databaseName,
});
const pagesCollection = db.collection(collectionName);
return {
queryType: "mongodb",
drop,
close,
metadata: {
databaseName,
collectionName,
},
async loadPages(args) {
const filter = args
? createQueryFilterFromLoadPagesArgs(args)
: {};
return pagesCollection.find(filter).toArray();
},
async updatePages(pages) {
await Promise.all(pages.map(async (page) => {
const result = await pagesCollection.updateOne((0, pageIdentity_1.pageIdentity)(page), { $set: page }, { upsert: true });
if (!result.acknowledged) {
throw new Error(`update pages not acknowledged!`);
}
if (!result.modifiedCount && !result.upsertedCount) {
throw new Error(`Page ${JSON.stringify((0, pageIdentity_1.pageIdentity)(page))} not updated!`);
}
}));
},
async deletePages({ dataSources, permanent = false, inverse = false, }) {
const filter = {
...(dataSources
? { sourceName: { [inverse ? "$nin" : "$in"]: dataSources } }
: undefined),
};
if (permanent) {
const result = await pagesCollection.deleteMany(filter);
if (!result.acknowledged) {
throw new Error(`Permanent-delete pages not acknowledged!`);
}
}
else {
const result = await pagesCollection.updateMany(filter, {
$set: { action: "deleted" },
});
if (!result.acknowledged) {
throw new Error(`Soft-delete pages not acknowledged!`);
}
}
},
async init() {
await pagesCollection.createIndex({ url: 1 });
await pagesCollection.createIndex({ sourceName: 1 });
},
};
}
exports.makeMongoDbPageStore = makeMongoDbPageStore;
function createQueryFilterFromLoadPagesArgs(args) {
const { query, sources, updated, urls } = args;
// We use $and to support custom queries along with the other filters.
// The $and operator requires at least one element, so we add an empty
// filter.
const filter = {
$and: [{}],
};
// Handle custom queries
if (query !== undefined) {
if (typeof query === "object" && query !== null) {
filter["$and"].push(query);
}
else {
throw new Error(`Invalid query - MongoDbPageStore expects a MongoDB query filter. Instead, got: ${query}`);
}
}
// Handle other query filters
if (updated !== undefined) {
filter["$and"][0].updated = { $gte: updated };
}
if (urls !== undefined) {
filter["$and"][0].url = { $in: urls };
}
if (sources !== undefined) {
filter["$and"][0].sourceName = { $in: sources };
}
return filter;
}
//# sourceMappingURL=MongoDbPageStore.js.map