@lossless.org/nosqldb 10.5.1 → 10.6.1

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.
Binary file
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "format": "tsrust.build-provenance.v2",
3
- "binarySha256": "8c37f2f7145d294c088c5d654c1b34c81defaf44de9229dbf31df5088ac21f86",
3
+ "binarySha256": "45c8b46b088226aabaf6b260d1b4cd33f630b9f350f412fc9526f63754ebf8ed",
4
4
  "buildInfo": {
5
5
  "projectName": "@lossless.org/nosqldb",
6
- "projectVersion": "10.5.1",
7
- "gitCommit": "56110dace6865cf5deb07908ba50bf3c8849621f",
6
+ "projectVersion": "10.6.1",
7
+ "gitCommit": "8a382123c5eb00f062a89c786c87f0588332f0a7",
8
8
  "gitDirty": false,
9
- "builtAt": "2026-09-24T21:04:53.734Z",
10
- "tsrustVersion": "1.13.2",
9
+ "builtAt": "2026-09-26T11:38:26.096Z",
10
+ "tsrustVersion": "1.15.1",
11
11
  "binary": "rustdb",
12
12
  "target": "linux_amd64"
13
13
  }
Binary file
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "format": "tsrust.build-provenance.v2",
3
- "binarySha256": "2def4672487def714c557582068f103345e3cb82f7d529acc8507f1df1ee89da",
3
+ "binarySha256": "69c2b52877d8d92145f105263807d1ee7e5c41fab58ffe6adcc8ad6f4c9a6e30",
4
4
  "buildInfo": {
5
5
  "projectName": "@lossless.org/nosqldb",
6
- "projectVersion": "10.5.1",
7
- "gitCommit": "56110dace6865cf5deb07908ba50bf3c8849621f",
6
+ "projectVersion": "10.6.1",
7
+ "gitCommit": "8a382123c5eb00f062a89c786c87f0588332f0a7",
8
8
  "gitDirty": false,
9
- "builtAt": "2026-09-24T21:04:54.616Z",
10
- "tsrustVersion": "1.13.2",
9
+ "builtAt": "2026-09-26T11:38:26.947Z",
10
+ "tsrustVersion": "1.15.1",
11
11
  "binary": "rustdb",
12
12
  "target": "linux_amd64_musl"
13
13
  }
Binary file
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "format": "tsrust.build-provenance.v2",
3
- "binarySha256": "1c92e0c5dec9c53fc175eda8fb4fc32e78f8075672170feed3542ce58337491b",
3
+ "binarySha256": "bdb5b22a9d6d338e0a8474fec47233fa0da53f7a7e4771958ce32e75e6102da7",
4
4
  "buildInfo": {
5
5
  "projectName": "@lossless.org/nosqldb",
6
- "projectVersion": "10.5.1",
7
- "gitCommit": "56110dace6865cf5deb07908ba50bf3c8849621f",
6
+ "projectVersion": "10.6.1",
7
+ "gitCommit": "8a382123c5eb00f062a89c786c87f0588332f0a7",
8
8
  "gitDirty": false,
9
- "builtAt": "2026-09-24T21:04:54.182Z",
10
- "tsrustVersion": "1.13.2",
9
+ "builtAt": "2026-09-26T11:38:26.518Z",
10
+ "tsrustVersion": "1.15.1",
11
11
  "binary": "rustdb",
12
12
  "target": "linux_arm64"
13
13
  }
Binary file
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "format": "tsrust.build-provenance.v2",
3
- "binarySha256": "0e46f1e7642c78ad1f5185ed3ede057a7885b95ff6429a58574f7df11b3105a0",
3
+ "binarySha256": "e08e92879b6a3c1f8f5e91a90bb0c26cf5a6500af87bbf129f4c0833a1c21a61",
4
4
  "buildInfo": {
5
5
  "projectName": "@lossless.org/nosqldb",
6
- "projectVersion": "10.5.1",
7
- "gitCommit": "56110dace6865cf5deb07908ba50bf3c8849621f",
6
+ "projectVersion": "10.6.1",
7
+ "gitCommit": "8a382123c5eb00f062a89c786c87f0588332f0a7",
8
8
  "gitDirty": false,
9
- "builtAt": "2026-09-24T21:04:55.038Z",
10
- "tsrustVersion": "1.13.2",
9
+ "builtAt": "2026-09-26T11:38:27.390Z",
10
+ "tsrustVersion": "1.15.1",
11
11
  "binary": "rustdb",
12
12
  "target": "linux_arm64_musl"
13
13
  }
Binary file
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "format": "tsrust.build-provenance.v2",
3
- "binarySha256": "935b424dae329677ff6fcdba1cfb2a16a6eb15e334c4fc37bbb5186cd7ba8f4f",
3
+ "binarySha256": "bc8d7bed405a7aea9281f786c2cb845836c109a577882403dff5cae1ddab2e3b",
4
4
  "buildInfo": {
5
5
  "projectName": "@lossless.org/nosqldb",
6
- "projectVersion": "10.5.1",
7
- "gitCommit": "56110dace6865cf5deb07908ba50bf3c8849621f",
6
+ "projectVersion": "10.6.1",
7
+ "gitCommit": "8a382123c5eb00f062a89c786c87f0588332f0a7",
8
8
  "gitDirty": false,
9
- "builtAt": "2026-09-24T20:49:57.292Z",
10
- "tsrustVersion": "1.13.2",
9
+ "builtAt": "2026-09-26T11:22:15.998Z",
10
+ "tsrustVersion": "1.15.1",
11
11
  "binary": "rustdb",
12
12
  "target": "macos_amd64"
13
13
  }
Binary file
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "format": "tsrust.build-provenance.v2",
3
- "binarySha256": "a1f4451de5227383ac797ec36ea255f1d281d696ad9b17efefa9244a989c3881",
3
+ "binarySha256": "f7b402ccadcdf3e272b82c07f1af67ebbc1556d5b6d7c974383771b643cb8f14",
4
4
  "buildInfo": {
5
5
  "projectName": "@lossless.org/nosqldb",
6
- "projectVersion": "10.5.1",
7
- "gitCommit": "56110dace6865cf5deb07908ba50bf3c8849621f",
6
+ "projectVersion": "10.6.1",
7
+ "gitCommit": "8a382123c5eb00f062a89c786c87f0588332f0a7",
8
8
  "gitDirty": false,
9
- "builtAt": "2026-09-24T20:49:57.881Z",
10
- "tsrustVersion": "1.13.2",
9
+ "builtAt": "2026-09-26T11:22:16.581Z",
10
+ "tsrustVersion": "1.15.1",
11
11
  "binary": "rustdb",
12
12
  "target": "macos_arm64"
13
13
  }
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@lossless.org/nosqldb',
6
- version: '10.5.1',
6
+ version: '10.6.1',
7
7
  description: 'A MongoDB-compatible embedded database server with wire protocol support, backed by a high-performance Rust engine.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx1QkFBdUI7SUFDN0IsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLHFIQUFxSDtDQUNuSSxDQUFBIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lossless.org/nosqldb",
3
- "version": "10.5.1",
3
+ "version": "10.6.1",
4
4
  "private": false,
5
5
  "description": "A MongoDB-compatible embedded database server with wire protocol support, backed by a high-performance Rust engine.",
6
6
  "exports": {
@@ -16,10 +16,10 @@
16
16
  "@design.estate/dees-element": "^2.2.4",
17
17
  "@git.zone/tsbuild": "^5.0.0",
18
18
  "@git.zone/tsbundle": "^2.15.0",
19
- "@git.zone/tsrust": "^1.13.2",
20
- "@git.zone/tstest": "^6.2.0",
19
+ "@git.zone/tsrust": "^1.15.1",
20
+ "@git.zone/tstest": "^6.3.0",
21
21
  "@lossless.org/client": "0.1.1",
22
- "@types/node": "26.6.1",
22
+ "@types/node": "26.6.2",
23
23
  "mongodb": "^7.5.0"
24
24
  },
25
25
  "dependencies": {
package/readme.md CHANGED
@@ -554,21 +554,60 @@ authority. Auth changes and the data/control records they protect share native
554
554
  atomic publications.
555
555
 
556
556
  Single-node transactions pin one committed root across namespaces and retain
557
- changed documents, rather than copying a database. Supported reads and writes
558
- see the transaction snapshot plus its staged changes. Commit validates conflicts
559
- and publishes atomically; abort discards staged changes. Write conflicts report
560
- `WriteConflict` (112) with `TransientTransactionError`.
561
-
562
- A staged write conflicts when it touches a document `_id` or a unique index key
563
- that another transaction or statement wrote after this transaction's snapshot:
564
- for example two transactions that both read a claim as absent and then insert
565
- it under the same `_id`, or under distinct `_id`s with the same unique key.
566
- Statements validate against the snapshot, so such a collision is reported when
567
- the loser commits; nothing of the losing transaction is published. The driver's
568
- `withTransaction` retries the transient error, and the retry observes the
569
- winner. A key already visible in the transaction's snapshot is not a conflict:
570
- inserting it fails the statement with `DuplicateKey` (11000), as outside a
571
- transaction.
557
+ changed documents, rather than copying a database. The snapshot is pinned by
558
+ the transaction's first statement. Supported reads and writes see the
559
+ transaction snapshot plus its staged changes. Commit publishes atomically;
560
+ abort discards staged changes.
561
+
562
+ Write conflicts follow MongoDB: the first statement to write a document or a
563
+ unique index key wins, and the later writer is told at its own statement.
564
+
565
+ - A transaction statement that inserts, updates, replaces, deletes or upserts a
566
+ document, or claims or releases a unique index key, that another open
567
+ transaction has already written fails with `WriteConflict` (112) and
568
+ `TransientTransactionError`. So does a write to a document or key that was
569
+ published after the transaction's snapshot. The failed statement aborts the
570
+ transaction at once and releases everything it wrote: later statements and
571
+ `commitTransaction` report `NoSuchTransaction` (251), also labelled
572
+ `TransientTransactionError`. The transaction that wrote first keeps its
573
+ documents and commits. The driver's `withTransaction` retries the loser on a
574
+ fresh snapshot, so a transaction that writes a hot document and then does more
575
+ work makes progress against clients looping short transactions on it.
576
+ - Reads never conflict: they see the snapshot, not another transaction's
577
+ uncommitted writes. A statement that writes nothing (a filter that matches
578
+ nothing in the snapshot, an update that leaves the document unchanged) does
579
+ not conflict either.
580
+ - A write outside a transaction that meets an open transaction's uncommitted
581
+ write waits until that transaction commits or aborts, then runs on the new
582
+ state: after a commit it applies on top of the transaction's write, and a
583
+ unique key the transaction claimed becomes `DuplicateKey` (11000). The wait
584
+ is bounded by `maxTimeMS`, which ends it with `MaxTimeMSExpired` (50) and
585
+ nothing written, and holds no write worker, so the transaction can always
586
+ finish. Writes to other documents are not delayed. A multi-document write
587
+ outside a transaction stays all-or-nothing: it publishes nothing until it can
588
+ publish every document.
589
+ - After a transaction has been open for 60 seconds, its uncommitted writes no
590
+ longer block others: the next writer that needs one of its documents aborts
591
+ it, and it reports `NoSuchTransaction` (251) on its next statement or commit.
592
+ The limit is fixed at MongoDB's default `transactionLifetimeLimitSeconds` and
593
+ is not configurable. A transaction nobody contends with is not
594
+ aborted by age alone. Ending or expiring the session, and stopping the
595
+ server, release a transaction's writes as well.
596
+ - TTL expiry is not a contending writer. It leaves out the documents an open
597
+ transaction has written, deletes the other expired documents of the index
598
+ and moves past the held ones. A later pass over the index expires those
599
+ still expired once the transaction has ended. It never waits for a transaction and never aborts
600
+ one, whatever its age. MongoDB's TTL monitor instead retries a conflicting delete until
601
+ the transaction ends and leaves aborting it to its transaction reaper.
602
+ - A key already visible in the transaction's snapshot is not a conflict:
603
+ inserting it fails the statement with `DuplicateKey` (11000), as outside a
604
+ transaction. A collection created inside a transaction has no stored identity
605
+ until commit, so two transactions creating the same collection both succeed
606
+ their statements and the second commit reports `WriteConflict` (112), as on
607
+ MongoDB 7.
608
+
609
+ Write intents live in memory only; no transaction survives a restart, so
610
+ there is nothing to recover.
572
611
 
573
612
  Commit/abort outcomes and successful retryable statement results survive file
574
613
  storage restart. Duplicate commits replay their outcome; abort after commit
@@ -1309,7 +1348,7 @@ await collection.findOneAndReplace({ _id: id }, { name: 'Replaced' }, { returnDo
1309
1348
 
1310
1349
  // Element
1311
1350
  { email: { $exists: true } }
1312
- { type: { $type: 'string' } }
1351
+ { type: { $type: 'string' } } { value: { $type: ['int', 'long'] } }
1313
1352
 
1314
1353
  // Array
1315
1354
  { tags: { $all: ['mongodb', 'database'] } }
@@ -1318,8 +1357,28 @@ await collection.findOneAndReplace({ _id: id }, { name: 'Replaced' }, { returnDo
1318
1357
 
1319
1358
  // Regex
1320
1359
  { name: { $regex: /^Al/i } }
1360
+
1361
+ // Aggregation expressions
1362
+ { owner: 'o', $expr: { $lte: [{ $add: ['$retainedBytes', '$reservedBytes', size] }, max] } }
1363
+ { $expr: { $gt: ['$leaseExpiresAt', '$$NOW'] } }
1321
1364
  ```
1322
1365
 
1366
+ `$type` takes a type alias (`'string'`, `'number'`, …), a numeric BSON type
1367
+ code or an array of them, and matches an array field through its elements as
1368
+ well as `'array'` itself.
1369
+
1370
+ `$expr` evaluates an aggregation expression per document in `find`, `count`,
1371
+ `distinct`, `update`, `delete`, `findAndModify` and a `$match` stage, and
1372
+ matches when the result is truthy. It accepts the operators listed under
1373
+ [Aggregation Pipeline](#aggregation-pipeline). Evaluation is charged against
1374
+ the same work budget as every other predicate, and an operator the engine does
1375
+ not implement is refused by name with `TypeMismatch` (code 14) before any
1376
+ document is read. `$$NOW` is one instant per command, as in MongoDB: the
1377
+ engine reads the clock once when the command starts, and the command's filter,
1378
+ every document of a pipeline update, every aggregation stage, `$lookup` and
1379
+ `$unionWith` sub-pipeline, and every `getMore` of its cursor see that instant.
1380
+ Filters outside a command, such as a partial index filter, have no `$$NOW`.
1381
+
1323
1382
  ### Update Operators
1324
1383
 
1325
1384
  ```typescript
@@ -1356,15 +1415,57 @@ const results = await collection.aggregate([
1356
1415
 
1357
1416
  **Supported stages:** `$match`, `$project`, `$group`, `$sort`, `$limit`, `$skip`, `$unwind`, `$lookup`, `$addFields`, `$count`, `$facet`, `$replaceRoot`, `$set`, `$unionWith`, `$out`, `$merge`
1358
1417
 
1359
- **Supported expression operators:** `$eq`, `$and`, `$literal`, `$map`,
1360
- `$objectToArray`, `$setEquals`, plus `$field` paths, `$$variable` references
1361
- including `$$ROOT`, and documents or arrays of those. Every other operator is
1362
- refused by name with `TypeMismatch` (code 14) before any document is read; the
1363
- engine never treats an operator it cannot execute as a literal value.
1418
+ **Supported expression operators:**
1419
+
1420
+ | Group | Operators |
1421
+ | --- | --- |
1422
+ | Comparison | `$eq`, `$ne`, `$gt`, `$gte`, `$lt`, `$lte`, `$cmp` |
1423
+ | Arithmetic | `$add`, `$subtract`, `$multiply`, `$divide` |
1424
+ | Logical | `$and`, `$or`, `$not` |
1425
+ | Conditional and variables | `$cond` (array or `if`/`then`/`else` form), `$ifNull` (two or more operands), `$let` |
1426
+ | Type and arrays | `$isNumber`, `$type`, `$in`, `$size`, `$arrayElemAt` |
1427
+ | Dates | `$dateAdd` |
1428
+ | Collections | `$map`, `$objectToArray`, `$setEquals` |
1429
+ | Literals | `$literal` |
1430
+
1431
+ plus `$field` paths, `$$variable` references including `$$ROOT` and `$$NOW`,
1432
+ and documents or arrays of those. Every other operator is refused by name with
1433
+ `TypeMismatch` (code 14) before any document is read; the engine never treats
1434
+ an operator it cannot execute as a literal value.
1435
+
1436
+ Expressions follow MongoDB's value semantics. A field that is absent is
1437
+ *missing*, which is not `null`: `$type` answers `'missing'`, `$ifNull`
1438
+ replaces both, and comparisons order values as MongoDB does (MinKey, missing,
1439
+ `null`, numbers, strings, objects, arrays, binary data, ObjectIds, booleans,
1440
+ dates, timestamps, regular expressions, MaxKey), so `{ $eq: ['$absent', null] }`
1441
+ is false. Numbers compare by value across their wire types. A path through an
1442
+ array maps over its elements and always answers an array: `'$mailbox.path'`
1443
+ over one looked-up document is `['INBOX']`, so `$arrayElemAt` and `$size`
1444
+ apply to it. Arithmetic answers `null` when an operand is `null` or missing;
1445
+ an int result that overflows widens to a long and a long to a double, a double
1446
+ operand makes the result a double, and `$divide` always answers a double.
1447
+ `$add` accepts one date and answers a date; date minus date is milliseconds.
1448
+ Runtime errors keep MongoDB 7's codes: a non-numeric operand is
1449
+ `TypeMismatch` (14), `can't $divide by zero` is `BadValue` (2), a date that
1450
+ leaves the 64-bit range is `Overflow` (15), and the array and date operators
1451
+ answer MongoDB's location codes (a second date in `$add` 16612, `$in` without
1452
+ an array 40081, `$size` without an array 17124, `$arrayElemAt` 28689–28691,
1453
+ `$dateAdd` 5166403, 5166405, 5166406 and 5439013, a non-string time zone
1454
+ 40517, an unknown unit `FailedToParse` (9)). Decimal128 operands in arithmetic
1455
+ are refused with `TypeMismatch` (14) — decimal arithmetic is not
1456
+ implemented. `$and`, `$or`, `$cond` and `$ifNull`
1457
+ evaluate, and charge, only the operands MongoDB evaluates, so a guard keeps an
1458
+ invalid branch from failing the statement. `$dateAdd` computes in UTC with the
1459
+ units `millisecond` to `year`, clamping `month`, `quarter` and `year` to the
1460
+ end of the target month; a `timezone` other than UTC is refused by name.
1461
+ Within a document expression a member that is missing is still written as
1462
+ `null`, where MongoDB omits the member.
1364
1463
 
1365
1464
  `$lookup` supports the equality form and a bounded correlated pipeline form with
1366
- `let`, an optional `$match` using `$expr`/`$and`/`$eq`, and an optional following
1367
- `$limit`. Correlated string equality predicates can use a full-key or subset
1465
+ `let`, an optional `$match` (any filter, `$expr` included), and an optional
1466
+ following `$limit`. A `let` variable that reads an absent local field is bound
1467
+ to the missing value, as in MongoDB. Correlated string equality predicates
1468
+ (`$expr` with `$eq`, optionally under `$and`) can use a full-key or subset
1368
1469
  foreign equality index to reduce candidates when available. Candidates are
1369
1470
  paged, the complete expression remains authoritative, and `$limit` counts only
1370
1471
  exact expression matches. Other BSON value shapes use the bounded scan path.
@@ -1379,6 +1480,18 @@ matcher cannot pre-compile fall back to the unnarrowed load, so results are
1379
1480
  unchanged. The materialization limit therefore applies to the matched set, which
1380
1481
  is what lets `countDocuments(filter)` run against collections larger than it.
1381
1482
 
1483
+ The scalar members of a `$in` or `$nin` list are looked up in a set built when
1484
+ the filter is validated, so a document costs the size of its value, not the
1485
+ length of the list: `countDocuments({ _id: { $in: ids } })` answers for tens of
1486
+ thousands of ids. Equality is unchanged: numbers of every type are equal by
1487
+ value (1, `NumberLong(1)`, 1.0 and `NumberDecimal("1.00")`), an array field
1488
+ matches through its elements or as a whole, and a missing field matches a list
1489
+ that holds `null`. Documents, arrays and regular expressions in a list are
1490
+ compared one by one and charged as such. A regular expression in a list is
1491
+ still compared as a value and not yet applied to strings, which differs from
1492
+ MongoDB, where it matches the strings it describes; that difference is a known
1493
+ open defect.
1494
+
1382
1495
  **Group accumulators:** `$sum`, `$avg`, `$min`, `$max`, `$first`, `$last`, `$push`, `$addToSet`, `$count`
1383
1496
 
1384
1497
  `$group._id` accepts a literal (`null`, a number, a string), a `$field`
@@ -1408,12 +1521,50 @@ await collection.dropIndexes(); // drop all except _id
1408
1521
  > 🛡️ **Unique indexes are enforced at the engine level.** Duplicate values are rejected with a `DuplicateKey` error (code 11000) *before* the document is written to disk — on `insertOne`, `updateOne`, `findAndModify`, and upserts. Index definitions and entries are committed with native storage and survive restart.
1409
1522
 
1410
1523
  NoSQLDB supports ascending and descending index keys with `name`, `unique`,
1411
- `sparse`, and `expireAfterSeconds` options. It accepts `background` as a
1412
- validated no-op and index version `v: 2`. Unsupported options, including
1413
- `partialFilterExpression`, `collation`, and `hidden`, are rejected before any
1414
- index in the request is created. Native maintenance expires eligible BSON dates
1415
- and date arrays in bounded batches, preserving publication holds and active
1416
- snapshots.
1524
+ `sparse`, `partialFilterExpression` and `expireAfterSeconds` options. It
1525
+ accepts `background` as a validated no-op and index version `v: 2`.
1526
+ Unsupported options, including `collation` and `hidden`, are rejected before
1527
+ any index in the request is created. Native maintenance expires eligible BSON
1528
+ dates and date arrays in bounded batches, preserving publication holds and
1529
+ active snapshots.
1530
+
1531
+ **Partial indexes.** An index with a `partialFilterExpression` holds only the
1532
+ documents that match the filter, and a unique partial index enforces
1533
+ uniqueness among those documents only:
1534
+
1535
+ ```typescript
1536
+ await jobs.createIndex(
1537
+ { activeClaimKey: 1 },
1538
+ { unique: true, partialFilterExpression: { activeClaimKey: { $exists: true } } },
1539
+ );
1540
+ await pulls.createIndex(
1541
+ { org: 1, repo: 1, sourceRef: 1, targetRef: 1 },
1542
+ { unique: true, partialFilterExpression: { state: 'open' } },
1543
+ );
1544
+ ```
1545
+
1546
+ The filter accepts MongoDB's subset: equality (`field: value` or `$eq`),
1547
+ `$exists: true`, `$gt`, `$gte`, `$lt`, `$lte`, `$type`, `$in`, `$and` and
1548
+ `$or`, nested at most four expression levels deep. Any other expression —
1549
+ `$exists: false`, `$ne`, `$nin`, `$not`, `$nor`, regular expressions,
1550
+ `$elemMatch`, `$size`, `$expr`, and a regular expression inside `$in` — and a
1551
+ filter combined with `sparse` are refused with `CannotCreateIndex` (code 67);
1552
+ a malformed filter is `BadValue` (2) and a non-document is `TypeMismatch` (14).
1553
+ An update that moves a document into the filter claims its key, one that moves
1554
+ it out releases it, and transactions claim keys the same way, so a racing
1555
+ claim is a `WriteConflict` (112) with `TransientTransactionError`.
1556
+ `listIndexes`, canonical export and import report the filter exactly as it was
1557
+ created. The filter identifies the index: the same name with a different
1558
+ filter is `IndexKeySpecsConflict` (86); the same key with an equivalent filter
1559
+ under another name is `IndexOptionsConflict` (85); a different filter over the
1560
+ same key under another name is a separate index. Equivalence treats implicit
1561
+ equality and `$eq`, the order of conjuncts and `$or` branches, numeric wire
1562
+ types and `$in` duplicates as MongoDB's normalised expressions do. The query
1563
+ planner never selects a partial index on its own; a `hint` naming one reads
1564
+ only its members, as MongoDB's hinted scan does. A partial TTL index expires
1565
+ only its members. Engines older than this release refuse a storage root that
1566
+ holds a partial index instead of enforcing its uniqueness over every
1567
+ document.
1417
1568
 
1418
1569
  `find()` and collection `aggregate()` accept `hint` as an index name (including
1419
1570
  `_id_`) or an exact ascending/descending key pattern. Key-pattern order matters;
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@lossless.org/nosqldb',
6
- version: '10.5.1',
6
+ version: '10.6.1',
7
7
  description: 'A MongoDB-compatible embedded database server with wire protocol support, backed by a high-performance Rust engine.'
8
8
  }