简体   繁体   中英

How to query MongoDb subdocuments in Java

Dear MongoDb Experts out there. I am new to Mongo and I am currently working with a MongoDb with Java.

Having a MongoDb with a collection called "teams" with the following example structure:

{[
  {
    "id": "123",
    "name": "Dev1",
    "employees": [
      {"name": "John", "age": 30},
      {"name": "Jane", "age": 30}
    ]
  },
  {
    "id": "456",
    "name": "Dev2",
    "employees": [
      {"name": "Mike", "age": 30},
      {"name": "Oscar", "age": 27}
    ]
  }
]}

I want to have a query which returns an array with all employees, that are 30 years old. So the expected result would be:

{[
  {"name": "John", "age": 30},
  {"name": "Jane", "age": 30},
  {"name": "Mike", "age": 30}
]}

It would be even better to only get the employees name (since I know the age I searched for), like:

{[
  {"name": "John"},
  {"name": "Jane"},
  {"name": "Mike"}
]}

I have a MongoCollection object:

MongoCollection<Document> collection = mongoClient
    .getDatabase(databaseName)
    .getCollection("teams")

My question: Is it possible to retrieve my expected result from the MongoDb? If so, which operations do I have to call on my collection object?

Approach 1: Find with $elemMatch projection

db.getCollection('teams').find(
      {"employees.age":30},
      { "employees": { "$elemMatch": { "age": 30 } },"_id":0 } 
)

Output Format:

{
    "employees" : [ 
        {
            "name" : "John",
            "age" : 30.0
        }
    ]
}


{
    "employees" : [ 
        {
            "name" : "Mike",
            "age" : 30.0
        }
    ]
}

Approach 2: Aggregate with $unwind and key renaming using $projection

db.getCollection('teams').aggregate([
       {"$match": {"employees.age":30}} ,  
       {"$unwind":  "$employees"},
       {"$match": {"employees.age":30}} ,
       {"$project": {"name": "$employees.name","_id":0}}
])

Output format:

{
    "name" : "John"
}


{
    "name" : "Jane"
}


{
    "name" : "Mike"
}

Approach 1 would be faster, but require additional work at app layer. It is recommended to offload formatting tasks to app servers rather than on db itself.

Approach 2 can instantly give to the formatted results, doing the querying and formatting both in the database servers

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM