@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.
- package/dist_rust/rustdb_linux_amd64 +0 -0
- package/dist_rust/rustdb_linux_amd64.tsrust-build.json +5 -5
- package/dist_rust/rustdb_linux_amd64_musl +0 -0
- package/dist_rust/rustdb_linux_amd64_musl.tsrust-build.json +5 -5
- package/dist_rust/rustdb_linux_arm64 +0 -0
- package/dist_rust/rustdb_linux_arm64.tsrust-build.json +5 -5
- package/dist_rust/rustdb_linux_arm64_musl +0 -0
- package/dist_rust/rustdb_linux_arm64_musl.tsrust-build.json +5 -5
- package/dist_rust/rustdb_macos_amd64 +0 -0
- package/dist_rust/rustdb_macos_amd64.tsrust-build.json +5 -5
- package/dist_rust/rustdb_macos_arm64 +0 -0
- package/dist_rust/rustdb_macos_arm64.tsrust-build.json +5 -5
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/package.json +4 -4
- package/readme.md +180 -29
- package/ts/00_commitinfo_data.ts +1 -1
|
Binary file
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"format": "tsrust.build-provenance.v2",
|
|
3
|
-
"binarySha256": "
|
|
3
|
+
"binarySha256": "45c8b46b088226aabaf6b260d1b4cd33f630b9f350f412fc9526f63754ebf8ed",
|
|
4
4
|
"buildInfo": {
|
|
5
5
|
"projectName": "@lossless.org/nosqldb",
|
|
6
|
-
"projectVersion": "10.
|
|
7
|
-
"gitCommit": "
|
|
6
|
+
"projectVersion": "10.6.1",
|
|
7
|
+
"gitCommit": "8a382123c5eb00f062a89c786c87f0588332f0a7",
|
|
8
8
|
"gitDirty": false,
|
|
9
|
-
"builtAt": "2026-09-
|
|
10
|
-
"tsrustVersion": "1.
|
|
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": "
|
|
3
|
+
"binarySha256": "69c2b52877d8d92145f105263807d1ee7e5c41fab58ffe6adcc8ad6f4c9a6e30",
|
|
4
4
|
"buildInfo": {
|
|
5
5
|
"projectName": "@lossless.org/nosqldb",
|
|
6
|
-
"projectVersion": "10.
|
|
7
|
-
"gitCommit": "
|
|
6
|
+
"projectVersion": "10.6.1",
|
|
7
|
+
"gitCommit": "8a382123c5eb00f062a89c786c87f0588332f0a7",
|
|
8
8
|
"gitDirty": false,
|
|
9
|
-
"builtAt": "2026-09-
|
|
10
|
-
"tsrustVersion": "1.
|
|
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": "
|
|
3
|
+
"binarySha256": "bdb5b22a9d6d338e0a8474fec47233fa0da53f7a7e4771958ce32e75e6102da7",
|
|
4
4
|
"buildInfo": {
|
|
5
5
|
"projectName": "@lossless.org/nosqldb",
|
|
6
|
-
"projectVersion": "10.
|
|
7
|
-
"gitCommit": "
|
|
6
|
+
"projectVersion": "10.6.1",
|
|
7
|
+
"gitCommit": "8a382123c5eb00f062a89c786c87f0588332f0a7",
|
|
8
8
|
"gitDirty": false,
|
|
9
|
-
"builtAt": "2026-09-
|
|
10
|
-
"tsrustVersion": "1.
|
|
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": "
|
|
3
|
+
"binarySha256": "e08e92879b6a3c1f8f5e91a90bb0c26cf5a6500af87bbf129f4c0833a1c21a61",
|
|
4
4
|
"buildInfo": {
|
|
5
5
|
"projectName": "@lossless.org/nosqldb",
|
|
6
|
-
"projectVersion": "10.
|
|
7
|
-
"gitCommit": "
|
|
6
|
+
"projectVersion": "10.6.1",
|
|
7
|
+
"gitCommit": "8a382123c5eb00f062a89c786c87f0588332f0a7",
|
|
8
8
|
"gitDirty": false,
|
|
9
|
-
"builtAt": "2026-09-
|
|
10
|
-
"tsrustVersion": "1.
|
|
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": "
|
|
3
|
+
"binarySha256": "bc8d7bed405a7aea9281f786c2cb845836c109a577882403dff5cae1ddab2e3b",
|
|
4
4
|
"buildInfo": {
|
|
5
5
|
"projectName": "@lossless.org/nosqldb",
|
|
6
|
-
"projectVersion": "10.
|
|
7
|
-
"gitCommit": "
|
|
6
|
+
"projectVersion": "10.6.1",
|
|
7
|
+
"gitCommit": "8a382123c5eb00f062a89c786c87f0588332f0a7",
|
|
8
8
|
"gitDirty": false,
|
|
9
|
-
"builtAt": "2026-09-
|
|
10
|
-
"tsrustVersion": "1.
|
|
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": "
|
|
3
|
+
"binarySha256": "f7b402ccadcdf3e272b82c07f1af67ebbc1556d5b6d7c974383771b643cb8f14",
|
|
4
4
|
"buildInfo": {
|
|
5
5
|
"projectName": "@lossless.org/nosqldb",
|
|
6
|
-
"projectVersion": "10.
|
|
7
|
-
"gitCommit": "
|
|
6
|
+
"projectVersion": "10.6.1",
|
|
7
|
+
"gitCommit": "8a382123c5eb00f062a89c786c87f0588332f0a7",
|
|
8
8
|
"gitDirty": false,
|
|
9
|
-
"builtAt": "2026-09-
|
|
10
|
-
"tsrustVersion": "1.
|
|
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.
|
|
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.
|
|
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.
|
|
20
|
-
"@git.zone/tstest": "^6.
|
|
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.
|
|
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.
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
`
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
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:**
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
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`
|
|
1367
|
-
`$limit`.
|
|
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
|
|
1412
|
-
validated no-op and index version `v: 2`.
|
|
1413
|
-
|
|
1414
|
-
index in the request is created. Native maintenance expires eligible BSON
|
|
1415
|
-
and date arrays in bounded batches, preserving publication holds and
|
|
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;
|
package/ts/00_commitinfo_data.ts
CHANGED