Files
MultiforaDB/tests/spec/operators/pipeline.json
A.Shakhmatov e344a073a1 tests/spec: record the pipeline-style updates
An update document may be an *array* of aggregation stages instead of a
document of operators. The pinned crud corpus has five cases, one per command,
and not one of them is a refusal -- so which stages are allowed, what happens
to `_id`, and what an upsert does are all unmeasured there.

23 cases into the existing operator corpus rather than an eighth directory:
this is another shape of update document, and it shares the recorder, the
masking and the README.

Recorded red, 0/23. What it settled:

  - **`_id` always survives**, through `$replaceRoot: {newRoot: "$t"}` and
    through `$project: {_id: 0}` alike. A stage that sets it to a *different*
    value is ImmutableField (66); restating the same one is fine.
  - `$match`, `$group`, `$sort` and `$unwind` are real stages refused
    specifically here: InvalidOptions (72), "$X is not allowed to be used
    within an update". A name that is no stage at all is 40324, and two
    stages packed into one array element is 40323.
  - `arrayFilters` beside a pipeline is FailedToParse (9).
  - an upsert runs the pipeline over the document the filter implies.

Three shapes were authored and removed: `{b: 1, $set: {...}}`, an empty
pipeline, and a pipeline holding a non-document. The driver rejects all three
before they reach a server, so there is nothing to record.
2026-08-10 21:48:55 +03:00

2 lines
13 KiB
JSON

{"description":"pipeline","schemaVersion":"1.4","createEntities":[{"client":{"id":"client0"}},{"database":{"id":"database0","client":"client0","databaseName":"operator-corpus"}},{"collection":{"id":"collection0","database":"database0","collectionName":"coll"}}],"initialData":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"x":{"$numberInt":"1"},"y":{"$numberInt":"1"},"t":{"u":{"v":{"$numberInt":"1"}}}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"y":{"$numberInt":"1"}}]}],"tests":[{"description":"$replaceRoot keeps the _id it was given","operations":[{"object":"collection0","name":"updateOne","arguments":{"filter":{"_id":{"$numberInt":"1"}},"update":[{"$replaceRoot":{"newRoot":"$t"}}]},"expectResult":{"matchedCount":{"$numberInt":"1"},"modifiedCount":{"$numberInt":"1"},"upsertedCount":{"$numberInt":"0"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"u":{"v":{"$numberInt":"1"}}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"y":{"$numberInt":"1"}}]}]},{"description":"$replaceWith is the same stage under its short name","operations":[{"object":"collection0","name":"updateOne","arguments":{"filter":{"_id":{"$numberInt":"1"}},"update":[{"$replaceWith":"$t"}]},"expectResult":{"matchedCount":{"$numberInt":"1"},"modifiedCount":{"$numberInt":"1"},"upsertedCount":{"$numberInt":"0"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"u":{"v":{"$numberInt":"1"}}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"y":{"$numberInt":"1"}}]}]},{"description":"$project keeps the _id it did not mention","operations":[{"object":"collection0","name":"updateOne","arguments":{"filter":{"_id":{"$numberInt":"1"}},"update":[{"$project":{"x":{"$numberInt":"1"}}}]},"expectResult":{"matchedCount":{"$numberInt":"1"},"modifiedCount":{"$numberInt":"1"},"upsertedCount":{"$numberInt":"0"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"x":{"$numberInt":"1"}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"y":{"$numberInt":"1"}}]}]},{"description":"$project excluding _id keeps it anyway","operations":[{"object":"collection0","name":"updateOne","arguments":{"filter":{"_id":{"$numberInt":"1"}},"update":[{"$project":{"_id":{"$numberInt":"0"},"x":{"$numberInt":"1"}}}]},"expectResult":{"matchedCount":{"$numberInt":"1"},"modifiedCount":{"$numberInt":"1"},"upsertedCount":{"$numberInt":"0"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"x":{"$numberInt":"1"}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"y":{"$numberInt":"1"}}]}]},{"description":"$addFields adds to the document","operations":[{"object":"collection0","name":"updateOne","arguments":{"filter":{"_id":{"$numberInt":"1"}},"update":[{"$addFields":{"foo":{"$numberInt":"1"}}}]},"expectResult":{"matchedCount":{"$numberInt":"1"},"modifiedCount":{"$numberInt":"1"},"upsertedCount":{"$numberInt":"0"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"x":{"$numberInt":"1"},"y":{"$numberInt":"1"},"t":{"u":{"v":{"$numberInt":"1"}}},"foo":{"$numberInt":"1"}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"y":{"$numberInt":"1"}}]}]},{"description":"$set is $addFields under its other name","operations":[{"object":"collection0","name":"updateOne","arguments":{"filter":{"_id":{"$numberInt":"1"}},"update":[{"$set":{"foo":"$x"}}]},"expectResult":{"matchedCount":{"$numberInt":"1"},"modifiedCount":{"$numberInt":"1"},"upsertedCount":{"$numberInt":"0"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"x":{"$numberInt":"1"},"y":{"$numberInt":"1"},"t":{"u":{"v":{"$numberInt":"1"}}},"foo":{"$numberInt":"1"}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"y":{"$numberInt":"1"}}]}]},{"description":"$unset of one field","operations":[{"object":"collection0","name":"updateOne","arguments":{"filter":{"_id":{"$numberInt":"1"}},"update":[{"$unset":"y"}]},"expectResult":{"matchedCount":{"$numberInt":"1"},"modifiedCount":{"$numberInt":"1"},"upsertedCount":{"$numberInt":"0"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"x":{"$numberInt":"1"},"t":{"u":{"v":{"$numberInt":"1"}}}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"y":{"$numberInt":"1"}}]}]},{"description":"$unset of several fields","operations":[{"object":"collection0","name":"updateOne","arguments":{"filter":{"_id":{"$numberInt":"1"}},"update":[{"$unset":["y","t"]}]},"expectResult":{"matchedCount":{"$numberInt":"1"},"modifiedCount":{"$numberInt":"1"},"upsertedCount":{"$numberInt":"0"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"x":{"$numberInt":"1"}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"y":{"$numberInt":"1"}}]}]},{"description":"the stages run in order, each on the last one's output","operations":[{"object":"collection0","name":"updateOne","arguments":{"filter":{"_id":{"$numberInt":"1"}},"update":[{"$replaceRoot":{"newRoot":"$t"}},{"$addFields":{"foo":{"$numberInt":"1"}}}]},"expectResult":{"matchedCount":{"$numberInt":"1"},"modifiedCount":{"$numberInt":"1"},"upsertedCount":{"$numberInt":"0"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"u":{"v":{"$numberInt":"1"}},"foo":{"$numberInt":"1"}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"y":{"$numberInt":"1"}}]}]},{"description":"an expression reads the document the stage was handed","operations":[{"object":"collection0","name":"updateOne","arguments":{"filter":{"_id":{"$numberInt":"1"}},"update":[{"$addFields":{"z":{"$add":["$x","$y"]}}}]},"expectResult":{"matchedCount":{"$numberInt":"1"},"modifiedCount":{"$numberInt":"1"},"upsertedCount":{"$numberInt":"0"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"x":{"$numberInt":"1"},"y":{"$numberInt":"1"},"t":{"u":{"v":{"$numberInt":"1"}}},"z":{"$numberInt":"2"}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"y":{"$numberInt":"1"}}]}]},{"description":"a stage may restate the _id it already has","operations":[{"object":"collection0","name":"updateOne","arguments":{"filter":{"_id":{"$numberInt":"1"}},"update":[{"$addFields":{"_id":{"$numberInt":"1"}}}]},"expectResult":{"matchedCount":{"$numberInt":"1"},"modifiedCount":{"$numberInt":"0"},"upsertedCount":{"$numberInt":"0"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"x":{"$numberInt":"1"},"y":{"$numberInt":"1"},"t":{"u":{"v":{"$numberInt":"1"}}}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"y":{"$numberInt":"1"}}]}]},{"description":"a stage may not change the _id","operations":[{"object":"collection0","name":"updateOne","arguments":{"filter":{"_id":{"$numberInt":"1"}},"update":[{"$addFields":{"_id":{"$numberInt":"9"}}}]},"expectError":{"isError":true,"errorCode":{"$numberInt":"66"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"x":{"$numberInt":"1"},"y":{"$numberInt":"1"},"t":{"u":{"v":{"$numberInt":"1"}}}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"y":{"$numberInt":"1"}}]}]},{"description":"updateMany runs the pipeline on every match","operations":[{"object":"collection0","name":"updateMany","arguments":{"filter":{},"update":[{"$project":{"x":{"$numberInt":"1"}}},{"$addFields":{"foo":{"$numberInt":"1"}}}]},"expectResult":{"matchedCount":{"$numberInt":"2"},"modifiedCount":{"$numberInt":"2"},"upsertedCount":{"$numberInt":"0"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"x":{"$numberInt":"1"},"foo":{"$numberInt":"1"}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"foo":{"$numberInt":"1"}}]}]},{"description":"findOneAndUpdate with a pipeline","operations":[{"object":"collection0","name":"findOneAndUpdate","arguments":{"filter":{"_id":{"$numberInt":"1"}},"update":[{"$project":{"x":{"$numberInt":"1"}}},{"$addFields":{"foo":{"$numberInt":"1"}}}],"returnDocument":"after"},"expectResult":{"_id":{"$numberInt":"1"},"x":{"$numberInt":"1"},"foo":{"$numberInt":"1"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"x":{"$numberInt":"1"},"foo":{"$numberInt":"1"}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"y":{"$numberInt":"1"}}]}]},{"description":"an upsert runs the pipeline on the document the filter implies","operations":[{"object":"collection0","name":"deleteMany","arguments":{"filter":{}}},{"object":"collection0","name":"updateOne","arguments":{"filter":{"k":{"$numberInt":"1"}},"update":[{"$addFields":{"a":{"$numberInt":"1"}}}],"upsert":true},"expectResult":{"matchedCount":{"$numberInt":"0"},"modifiedCount":{"$numberInt":"0"},"upsertedCount":{"$numberInt":"1"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$$type":"objectId"},"k":{"$numberInt":"1"},"a":{"$numberInt":"1"}}]}]},{"description":"a pipeline that writes nothing new still reports a match","operations":[{"object":"collection0","name":"updateOne","arguments":{"filter":{"_id":{"$numberInt":"1"}},"update":[{"$addFields":{"x":{"$numberInt":"1"}}}]},"expectResult":{"matchedCount":{"$numberInt":"1"},"modifiedCount":{"$numberInt":"0"},"upsertedCount":{"$numberInt":"0"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"x":{"$numberInt":"1"},"y":{"$numberInt":"1"},"t":{"u":{"v":{"$numberInt":"1"}}}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"y":{"$numberInt":"1"}}]}]},{"description":"$match is not allowed inside an update","operations":[{"object":"collection0","name":"updateOne","arguments":{"filter":{"_id":{"$numberInt":"1"}},"update":[{"$match":{"x":{"$numberInt":"1"}}}]},"expectError":{"isError":true,"errorCode":{"$numberInt":"72"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"x":{"$numberInt":"1"},"y":{"$numberInt":"1"},"t":{"u":{"v":{"$numberInt":"1"}}}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"y":{"$numberInt":"1"}}]}]},{"description":"$group is not allowed inside an update","operations":[{"object":"collection0","name":"updateOne","arguments":{"filter":{"_id":{"$numberInt":"1"}},"update":[{"$group":{"_id":null}}]},"expectError":{"isError":true,"errorCode":{"$numberInt":"72"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"x":{"$numberInt":"1"},"y":{"$numberInt":"1"},"t":{"u":{"v":{"$numberInt":"1"}}}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"y":{"$numberInt":"1"}}]}]},{"description":"$sort is not allowed inside an update","operations":[{"object":"collection0","name":"updateOne","arguments":{"filter":{"_id":{"$numberInt":"1"}},"update":[{"$sort":{"x":{"$numberInt":"1"}}}]},"expectError":{"isError":true,"errorCode":{"$numberInt":"72"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"x":{"$numberInt":"1"},"y":{"$numberInt":"1"},"t":{"u":{"v":{"$numberInt":"1"}}}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"y":{"$numberInt":"1"}}]}]},{"description":"$unwind is not allowed inside an update","operations":[{"object":"collection0","name":"updateOne","arguments":{"filter":{"_id":{"$numberInt":"1"}},"update":[{"$unwind":"$t"}]},"expectError":{"isError":true,"errorCode":{"$numberInt":"72"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"x":{"$numberInt":"1"},"y":{"$numberInt":"1"},"t":{"u":{"v":{"$numberInt":"1"}}}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"y":{"$numberInt":"1"}}]}]},{"description":"a stage name that is not a stage at all","operations":[{"object":"collection0","name":"updateOne","arguments":{"filter":{"_id":{"$numberInt":"1"}},"update":[{"$bogus":{}}]},"expectError":{"isError":true,"errorCode":{"$numberInt":"40324"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"x":{"$numberInt":"1"},"y":{"$numberInt":"1"},"t":{"u":{"v":{"$numberInt":"1"}}}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"y":{"$numberInt":"1"}}]}]},{"description":"two stages packed into one array element","operations":[{"object":"collection0","name":"updateOne","arguments":{"filter":{"_id":{"$numberInt":"1"}},"update":[{"$addFields":{"a":{"$numberInt":"1"}},"$unset":"y"}]},"expectError":{"isError":true,"errorCode":{"$numberInt":"40323"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"x":{"$numberInt":"1"},"y":{"$numberInt":"1"},"t":{"u":{"v":{"$numberInt":"1"}}}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"y":{"$numberInt":"1"}}]}]},{"description":"arrayFilters alongside a pipeline","operations":[{"object":"collection0","name":"updateOne","arguments":{"filter":{"_id":{"$numberInt":"1"}},"update":[{"$addFields":{"a":{"$numberInt":"1"}}}],"arrayFilters":[{"i.b":{"$numberInt":"1"}}]},"expectError":{"isError":true,"errorCode":{"$numberInt":"9"}}}],"outcome":[{"collectionName":"coll","databaseName":"operator-corpus","documents":[{"_id":{"$numberInt":"1"},"x":{"$numberInt":"1"},"y":{"$numberInt":"1"},"t":{"u":{"v":{"$numberInt":"1"}}}},{"_id":{"$numberInt":"2"},"x":{"$numberInt":"2"},"y":{"$numberInt":"1"}}]}]}]}