-
Type:
Bug
-
Resolution: Fixed
-
Priority:
Critical - P2
-
Affects Version/s: None
-
Component/s: Change streams
-
None
-
Fully Compatible
-
v6.1, v6.0
-
QE 2022-09-19, QE 2022-10-03
-
None
-
None
-
None
-
None
-
None
-
None
-
None
We can open a change stream to watch events from non-system collections in a database, by using the regular expression "^system\." - starts with "system", and then an escaped .. All code below run on mongo shell connecting to single node replica set.
> t = db.watch([{$match: {"ns.coll": {$nin: [/^system\./]}}}])
However, this is NOT returning events from collections that start with "system" but are not actually system collections.
Strangely, the same regex when used in a list collections (or aggregate with $listCatalog) to show all non-system collections will work correctly ("system_js" is printed):
rs:PRIMARY> db.runCommand({listCollections: 1, filter: {name: {$nin: [/^system\./]}}})
{
"cursor" : {
"id" : NumberLong(0),
"ns" : "test.$cmd.listCollections",
"firstBatch" : [
{
"name" : "system_js",
"type" : "collection",
"options" : {
},
"info" : {
"readOnly" : false,
"uuid" : UUID("28c72e5c-204a-4943-b08c-b101413a2ebc")
},
"idIndex" : {
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_"
}
}
]
},
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1656618172, 2),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1656618172, 2)
}
In the change stream case, it seems like we have to escape the backslash as well and use "^system
." instead.
> t = db.watch([{$match: {"ns.coll": {$nin: [/^system\\./]}}}])
> t
{ "_id" : { "_data" : "8262BDF908000000012B042C0100296E5A1004CDB18D68D04F43BF868D66FC9DB28169463C6F7065726174696F6E54797065003C696E736572740046646F63756D656E744B65790046645F6964006462BDF908A431B84AA323A03E000004" }, "operationType" : "insert", "clusterTime" : Timestamp(1656617224, 1), "wallTime" : ISODate("2022-06-30T19:27:04.556Z"), "fullDocument" : { "_id" : ObjectId("62bdf908a431b84aa323a03e"), "b" : 1 }, "ns" : { "db" : "test", "coll" : "system_js" }, "documentKey" : { "_id" : ObjectId("62bdf908a431b84aa323a03e") } }
See comments for more info.