Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MongoDB - Select an array without parent arrays

Tags:

arrays

mongodb

I have the following MongoDB-Structure:

{
  "UserID" : 6,
  "_id" : ObjectId("54c4f824e81141175c0f4750"),
  "root" : {
    "files" : [],
    "folder" : [{
        "created" : "23-01-15",
        "files" : [],
        "folder" : [{
            "created" : "22-12-22",
            "folder" : [{
                "created" : "25-01-2015",
                "folder" : [{
                    "id" : 6,
                    "name" : "name!",
                    "created" : "25-01-2015",
                    "files" : []
                  }],
                "id" : 4,
                "name" : "folder2"
              }],
            "id" : 3,
            "name" : "folder1"
          }],
        "id" : 1,
        "name" : "MainFolder"
      }, {
        "id" : 2,
        "name" : "MainFolder2",
        "created" : "23-01-15"
      }]
  }
}

To find a folder i used this Query:

db.users_folders.find({"UserID": 6, "root.folder.0.folder": { $elemMatch: {id: 3}}}, {"root.folder.0.folder.$": 1})

Problem: The parent Array was displayed too (MainFolder). Any solutions, too exclude parent arrays?

like image 1000
user4503817 Avatar asked Jan 23 '26 11:01

user4503817


1 Answers

If I got your problem correctly one these will help you:

1: using aggregation:

db.users_folders.aggregate([
{ $match : {"UserID": 6, "root.folder.folder": { $elemMatch: {id: 3}}}} ,
{ $unwind : "$root.folder" },
{ $unwind : "$root.folder.folder" },
{ $match : { "root.folder.folder.id": 3}} ,
{ $project : {folder : "$root.folder.folder"} }
]).result

Will produce:

{
    "0" : {
        "_id" : ObjectId("54c4f824e81141175c0f4750"),
        "folder" : {
            "created" : "22-12-22",
            "folder" : [ 
                {
                    "created" : "25-01-2015",
                    "folder" : [ 
                        {
                            "id" : 6,
                            "name" : "name!",
                            "created" : "25-01-2015",
                            "files" : []
                        }
                    ],
                    "id" : 4,
                    "name" : "folder2"
                }
            ],
            "id" : 3,
            "name" : "folder1"
        }
    }
}

2: using findOne() method:

db.users_folders.findOne({"UserID": 6, "root.folder.0.folder": { $elemMatch: {id: 3}}}, {"root.folder.0.folder.$": 1}).root.folder[0].folder

Which produce:

{
    "0" : {
        "created" : "22-12-22",
        "folder" : [ 
            {
                "created" : "25-01-2015",
                "folder" : [ 
                    {
                        "id" : 6,
                        "name" : "name!",
                        "created" : "25-01-2015",
                        "files" : []
                    }
                ],
                "id" : 4,
                "name" : "folder2"
            }
        ],
        "id" : 3,
        "name" : "folder1"
    }
}
like image 123
2 revs, 2 users 67% Avatar answered Jan 26 '26 03:01

2 revs, 2 users 67%



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!