MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Spring Boot Data i MongoDB — filtrowanie zapytań dotyczących tablicy dokumentów podrzędnych

Cóż, w Spring Data takie zapytania nie są trivial .

Zła wiadomość:
Repozytorium danych Spring nie ma rozwiązania dla MongoDB Aggregation . Tak więc nie można zaimplementować w MongoRepository żadnej metody, aby to zrobić, na przykład aggregateBy...

Dobra wiadomość:
Spring Data zapewnia MongoTemplate klasa, która pozwala na wykonywanie złożonych zapytań, tak jak w standardowej powłoce MongoDB.

Tak więc, ponieważ chcesz po prostu exclude dokument podrzędny, który nie spełnia jakiegoś warunku, musimy zdefiniować zagregowane pipelines .

Zakładam:

zip codes are Numeric (In your example is string)
And, to exclude subdocument, we filter by `zip`
There is no any other filter

Agregacja MongoDB wyglądałaby następująco:

db.person.aggregate([
    {$unwind: "$address"},
    {$match: {"address.zip": 12345}},
    {$group: { _id: { "firstName":"$firstName", "lastName":"$lastName", _id:"$_id" }, address: { $push: "$address" } } },
    {$project: {_id:0, "firstName":"$_id.firstName", "lastName":"$_id.lastName", "address": "$address"}}
])

Jeśli wszystkie filtry się powiodą, otrzymamy:

[ 
    {
        "address" : [ 
            {
                "zip" : 12345
            }, 
            {
                "zip" : 12345
            }
        ],
        "firstName" : "George",
        "lastName" : "Washington"
    }
]

Teraz, w sposób Spring Data, musisz wprowadzić kilka zmian w swoim projekcie:

Najpierw znajdź swój mongo-config.xml gdzie musisz dodać:

<!-- Define the mongoDbFactory with your database Name  -->
<mongo:db-factory uri="mongodb://user:[email protected]:27017/db"/>

<!-- Define the MongoTemplate  -->
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
</bean>

MongoTemplate jest centralną klasą wsparcia MongoDB w Springu, zapewniającą zestawy funkcji do interakcji z bazą danych. Szablon ... zapewnia mapowanie między obiektami domeny i dokumenty MongoDB . Więcej informacji

Po drugie, w swoim @Service klasy, dodaj następujący kod do załadowania w @PostConstruct

@Autowired
private MongoOperations mongoOperations;

...

public List<Person> findByAddressZipCode(int zip) {

    List<AggregationOperation> list = new ArrayList<AggregationOperation>();
    list.add(Aggregation.unwind("address"));
    list.add(Aggregation.match(Criteria.where("address.zip").is(zip)));
    list.add(Aggregation.group("firstName", "lastName").push("address").as("address"));
    list.add(Aggregation.project("firstName", "lastName", "address"));
    TypedAggregation<Person> agg = Aggregation.newAggregation(Person.class, list);
    return mongoOperations.aggregate(agg, Person.class, Person.class).getMappedResults();
}

Uwaga: Obie, Person i Address powinien mieć domyślny pusty konstruktor!




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Dlaczego sterownik węzła MongoDB generujący pulę instancji powoduje zniszczenie błędów?

  2. Zaktualizuj wiele dokumentów według zestawu identyfikatorów. Mangusta

  3. Przełącz wartość logiczną za pomocą mongoDB

  4. MongoDB dropIndexes()

  5. Przegląd zarządzania użytkownikami MongoDB