MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Spring Boot Data и MongoDB - Filter Subdocument Array Query

Е, в Spring Data такъв тип заявки не са trivial .

Лоши новини:
Spring Data Repository няма решение за MongoDB Aggregation . Така че не можете да внедрите в MongoRepository никакъв метод за това, като aggregateBy...

Добра новина:
Spring Data предоставя MongoTemplate клас, който ви позволява да изпълнявате сложни заявки, както бихте направили в стандартната обвивка на MongoDB.

Така че, тъй като просто искате да exclude поддокумент, който не отговаря на дадено условие, трябва да дефинираме сборните pipelines .

Предполагам:

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

Агрегирането на MongoDB би било:

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"}}
])

Ако всички филтри са успешни, получаваме:

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

Сега, по метода на Spring Data, трябва да добавите някои промени във вашия проект:

Първо намерете своя mongo-config.xml където трябва да добавите:

<!-- 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 е централният клас на поддръжката на MongoDB на Spring, предоставяща набори от функции за взаимодействие с базата данни. Шаблонът ... осигурява съпоставяне между вашите обекти на домейн и документи MongoDB . Повече информация

Второ, във вашата @Service клас, добавете следния код, който да бъде зареден в @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();
}

Забележка: И двете, Person и Address трябва да има празен конструктор по подразбиране!




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Пул от връзки в пакет Go mgo

  2. Има ли все пак да откриете кои ip адреси са свързани към db?

  3. mongoDB обобщено търсене на вложен масив от обекти

  4. MongoDB:Mapreduce:намаляване->множество все още не се поддържа

  5. Mongo намира документи, където масивът съдържа x стойности на даден масив