For this, use aggregate(). Let us first create a collection with documents −
> db.demo393.insertOne( ... { ... Id1: "1", ... Name: "Chris", ... Id2: "100" ... } ... ); { "acknowledged" : true, "insertedId" : ObjectId("5e5e6dd522064be7ab44e804") } > db.demo393.insertOne( ... { ... Id1: "1", ... Name: "Chris", ... Id2: "101" ... } ... ); { "acknowledged" : true, "insertedId" : ObjectId("5e5e6dd522064be7ab44e805") } > db.demo393.insertOne( ... { ... Id1: "3", ... Name: "Chris", ... Id2: "100" ... } ... ); { "acknowledged" : true, "insertedId" : ObjectId("5e5e6dd522064be7ab44e806") } > db.demo393.insertOne( ... { ... Id1: "3", ... Name: "Mike", ... Id2: "101" ... } ... ); { "acknowledged" : true, "insertedId" : ObjectId("5e5e6dd522064be7ab44e807") }
Display all documents from a collection with the help of find() method −
> db.demo393.find();
This will produce the following output −
{ "_id" : ObjectId("5e5e6dd522064be7ab44e804"), "Id1" : "1", "Name" : "Chris", "Id2" : "100" } { "_id" : ObjectId("5e5e6dd522064be7ab44e805"), "Id1" : "1", "Name" : "Chris", "Id2" : "101" } { "_id" : ObjectId("5e5e6dd522064be7ab44e806"), "Id1" : "3", "Name" : "Chris", "Id2" : "100" } { "_id" : ObjectId("5e5e6dd522064be7ab44e807"), "Id1" : "3", "Name" : "Mike", "Id2" : "101" }
Following is the query to collectively match intersection of documents against a field −
> db.demo393.aggregate([ ... { "$match": { "Name": "Chris" } }, ... { "$group": { ... "_id": "$Id1", ... "docs": { "$push": "$$ROOT" }, ... "count": { "$sum": 1 } ... }}, ... { "$match": { ... "count": { "$gt": 1 }, ... "docs": { ... "$all": [ ... { "$elemMatch": { "Id2": "100" } }, ... { "$elemMatch": { "Id2": "101" } } ... ] ... } ... }} ... ])
This will produce the following output −
{ "_id" : "1", "docs" : [ { "_id" : ObjectId("5e5e6dd522064be7ab44e804"), "Id1" : "1", "Name" : "Chris", "Id2" : "100" }, { "_id" : ObjectId("5e5e6dd522064be7ab44e805"), "Id1" : "1", "Name" : "Chris", "Id2" : "101" } ], "count" : 2 }