Assuming User, List, and ListItem are Collections, you should be able to accomplish this using $lookup..
Here is a live demo of the following query..
Query:
db.users.aggregate([ { $match: { uniqueId: 1 } }, { $lookup: { from: "lists", localField: "uniqueId", foreignField: "userId", as: "lists" } }, { $lookup: { from: "listItems", localField: "uniqueId", foreignField: "userId", as: "listItems" } } ])
Dataset:
db={ // Simulates a DB ******** "users": [ // Simulates a Collection ******** { "firstname": "John", "lastname": "Smith", "email": "[email protected]", "password": "password123", "uniqueId": 1 }, { "firstname": "Jane", "lastname": "Doe", "email": "[email protected]", "password": "123password", "uniqueId": 2 } ], "lists": [ // Simulates a Collection ******** { "userId": 1, "name": "Johns List 1", "items": [ 11, 12, 13 ] }, { "userId": 2, "name": "Groceries", "items": [ 21, 22, 23 ] } ], "listItems": [ // Simulates a Collection ******** { "userId": 2, "itemId": 21, "title": "Apple", "notes": [] }, { "userId": 2, "itemId": 22, "title": "Banana", "notes": [] }, { "userId": 2, "itemId": 23, "title": "Strawberry", "notes": [] }, { "userId": 1, "itemId": 11, "title": "Oil Change", "notes": [] }, { "userId": 1, "itemId": 12, "title": "Pick Up Grandma", "notes": [] }, { "userId": 1, "itemId": 13, "title": "Go For Run", "notes": [] } ] }
Result:
[ { "_id": ObjectId("5a934e000102030405000008"), "email": "[email protected]", "firstname": "John", "lastname": "Smith", "listItems": [ { "_id": ObjectId("5a934e000102030405000003"), "itemId": 11, "notes": [], "title": "Oil Change", "userId": 1 }, { "_id": ObjectId("5a934e000102030405000004"), "itemId": 12, "notes": [], "title": "Pick Up Grandma", "userId": 1 }, { "_id": ObjectId("5a934e000102030405000005"), "itemId": 13, "notes": [], "title": "Go For Run", "userId": 1 } ], "lists": [ { "_id": ObjectId("5a934e000102030405000006"), "items": [ 11, 12, 13 ], "name": "Johns List 1", "userId": 1 } ], "password": "password123", "uniqueId": 1 } ]