@mastra/mongodb 0.0.0-zod-v4-compat-part-2-20250820135355 → 0.0.0-zod-v4-stuff-20250825154219

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -302,12 +302,15 @@ export class MongoDBVector extends MastraVector<MongoDBVectorFilter> {
302
302
  const mongoFilter = this.transformFilter(filter);
303
303
  const documentMongoFilter = documentFilter ? { [this.documentFieldName]: documentFilter } : {};
304
304
 
305
+ // Transform metadata field filters to use dot notation
306
+ const transformedMongoFilter = this.transformMetadataFilter(mongoFilter);
307
+
305
308
  // Combine the filters
306
309
  let combinedFilter: any = {};
307
- if (Object.keys(mongoFilter).length > 0 && Object.keys(documentMongoFilter).length > 0) {
308
- combinedFilter = { $and: [mongoFilter, documentMongoFilter] };
309
- } else if (Object.keys(mongoFilter).length > 0) {
310
- combinedFilter = mongoFilter;
310
+ if (Object.keys(transformedMongoFilter).length > 0 && Object.keys(documentMongoFilter).length > 0) {
311
+ combinedFilter = { $and: [transformedMongoFilter, documentMongoFilter] };
312
+ } else if (Object.keys(transformedMongoFilter).length > 0) {
313
+ combinedFilter = transformedMongoFilter;
311
314
  } else if (Object.keys(documentMongoFilter).length > 0) {
312
315
  combinedFilter = documentMongoFilter;
313
316
  }
@@ -329,6 +332,9 @@ export class MongoDBVector extends MastraVector<MongoDBVectorFilter> {
329
332
 
330
333
  if (candidateIds.length > 0) {
331
334
  vectorSearch.filter = { _id: { $in: candidateIds } };
335
+ } else {
336
+ // No documents match the filter, return empty results
337
+ return [];
332
338
  }
333
339
  }
334
340
 
@@ -588,4 +594,63 @@ export class MongoDBVector extends MastraVector<MongoDBVectorFilter> {
588
594
  if (!filter) return {};
589
595
  return translator.translate(filter);
590
596
  }
597
+
598
+ /**
599
+ * Transform metadata field filters to use MongoDB dot notation.
600
+ * Fields that are stored in the metadata subdocument need to be prefixed with 'metadata.'
601
+ * This handles filters from the Memory system which expects direct field access.
602
+ *
603
+ * @param filter - The filter object to transform
604
+ * @returns Transformed filter with metadata fields properly prefixed
605
+ */
606
+ private transformMetadataFilter(filter: any): any {
607
+ if (!filter || typeof filter !== 'object') return filter;
608
+
609
+ const transformed: any = {};
610
+
611
+ for (const [key, value] of Object.entries(filter)) {
612
+ // Check if this is a MongoDB operator (starts with $)
613
+ if (key.startsWith('$')) {
614
+ // For logical operators like $and, $or, recursively transform their contents
615
+ if (Array.isArray(value)) {
616
+ transformed[key] = value.map(item => this.transformMetadataFilter(item));
617
+ } else {
618
+ transformed[key] = this.transformMetadataFilter(value);
619
+ }
620
+ }
621
+ // Check if the key already has 'metadata.' prefix
622
+ else if (key.startsWith('metadata.')) {
623
+ // Already prefixed, keep as is
624
+ transformed[key] = value;
625
+ }
626
+ // Check if this is a known metadata field that needs prefixing
627
+ else if (this.isMetadataField(key)) {
628
+ // Add metadata. prefix for fields stored in metadata subdocument
629
+ transformed[`metadata.${key}`] = value;
630
+ } else {
631
+ // Keep other fields as is
632
+ transformed[key] = value;
633
+ }
634
+ }
635
+
636
+ return transformed;
637
+ }
638
+
639
+ /**
640
+ * Determine if a field should be treated as a metadata field.
641
+ * Common metadata fields include thread_id, resource_id, message_id, and any field
642
+ * that doesn't start with underscore (MongoDB system fields).
643
+ */
644
+ private isMetadataField(key: string): boolean {
645
+ // MongoDB system fields start with underscore
646
+ if (key.startsWith('_')) return false;
647
+
648
+ // Document-level fields that are NOT in metadata
649
+ const documentFields = ['_id', this.embeddingFieldName, this.documentFieldName];
650
+ if (documentFields.includes(key)) return false;
651
+
652
+ // Everything else is assumed to be in metadata
653
+ // This includes thread_id, resource_id, message_id, and any custom fields
654
+ return true;
655
+ }
591
656
  }
package/tsup.config.ts CHANGED
@@ -1,9 +1,6 @@
1
- import { spawn } from 'child_process';
2
- import { promisify } from 'util';
1
+ import { generateTypes } from '@internal/types-builder';
3
2
  import { defineConfig } from 'tsup';
4
3
 
5
- const exec = promisify(spawn);
6
-
7
4
  export default defineConfig({
8
5
  entry: ['src/index.ts'],
9
6
  format: ['esm', 'cjs'],
@@ -15,8 +12,6 @@ export default defineConfig({
15
12
  },
16
13
  sourcemap: true,
17
14
  onSuccess: async () => {
18
- await exec('pnpm', ['tsc', '-p', 'tsconfig.build.json'], {
19
- stdio: 'inherit',
20
- });
15
+ await generateTypes(process.cwd());
21
16
  },
22
17
  });