spring-data-mongo 查询数组示例

标签 spring-data spring-data-mongodb

我是 spring-data-mongo 的新手。我有以下文档 Food,我想使用 Querying Arrys 进行查询。我在关注食物收集

> db.food.find()
{ "_id" : 1, "fruit" : [  "apple",  "banana",  "peach" ] }
{ "_id" : 2, "fruit" : [  "apple",  "kumquat",  "orange" ] }
{ "_id" : 3, "fruit" : [  "cherry",  "banana",  "apple" ] }
>

我使用以下查询获得了正确的数据。 现在我想使用 Spring-data-mongo 来实现

> db.food.find({fruit : {$all : ["apple","banana"]}})
{ "_id" : 1, "fruit" : [  "apple",  "banana",  "peach" ] }
{ "_id" : 3, "fruit" : [  "cherry",  "banana",  "apple" ] }

请引用我目前的发展: 食物.java

package com.mkyong.model;
import java.util.List;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

@Document
public class Food {
    @Id
    private Double id;
    @Field
    private List<String> fruits;

    public Double getId() {
        return id;
    }
    public void setId(Double id) {
        this.id = id;
    }
    public List<String> getFruits() {
        return fruits;
    }
    public void setFruits(List<String> fruits) {
        this.fruits = fruits;
    }
    @Override
    public String toString() {
        return "Food [id=" + id + ", fruits=" + fruits + "]";
    }
}

食物库:

package com.mkyong.reposiroty;

import org.springframework.data.repository.CrudRepository;

import com.mkyong.model.Food;

public interface FoodRepository extends CrudRepository<Food, String>{

}

SpringMongoConfig.java

package com.mkyong.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.config.AbstractMongoConfiguration;

import com.mongodb.Mongo;
import com.mongodb.MongoClient;

@Configuration
public class SpringMongoConfig extends AbstractMongoConfiguration {

    @Override
    public String getDatabaseName() {
        return "test";
    }

    @Override
    @Bean
    public Mongo mongo() throws Exception {
        return new MongoClient("127.0.0.1");
    }
}

SpringConfig.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mongo="http://www.springframework.org/schema/data/mongo"
    xsi:schemaLocation="http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context-3.0.xsd
          http://www.springframework.org/schema/data/mongo
          http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
          http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <mongo:mongo host="127.0.0.1" port="27017" />
    <mongo:db-factory dbname="test" />

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

应用程序.java

package com.mkyong.core;

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

import com.mkyong.config.SpringMongoConfig;
import com.mkyong.model.Food;

public class App {

    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringMongoConfig.class);
        MongoOperations mongoOperations = (MongoOperations) ctx.getBean("mongoTemplate");

        Query q = new Query(Criteria.where("fruit").all("apple","banana"));
        List<Food> foods = mongoOperations.find(q, Food.class);

        for (Food food : foods) {
            System.out.println("-------------------");
            System.out.println("ID : "+ food.getId());
            System.out.println("Fruits : "+ food.getFruits());
        }
    }
}

主要方法的结果,它不拉任何东西。水果显示空。任何专家都可以帮我从 Fruits Array/List 中提取数据吗?如果您需要任何其他信息,请告诉我?

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
-------------------
ID : 1.0
Fruits : null
-------------------
ID : 3.0
Fruits : null

最佳答案

是的,我能够解决这个错误。需要进行以下更改:

将Food类中的数据类型改为private String[] fruit;

@Document
public class Food {
    @Id
    private Double id;
    @Field
    private String[] fruit;

    public Double getId() {
        return id;
    }
    public void setId(Double id) {
        this.id = id;
    }
    public String[] getFruit() {
        return fruit;
    }
    public void setFruit(String[] fruit) {
        this.fruit = fruit;
    }
}

下面是输出:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Query : Query: { "fruit" : { "$all" : [ "apple" , "banana"]}}, Fields: null, Sort: null
-------------------
ID : 1.0
Fruits : apple,banana,peach
-------------------
ID : 3.0
Fruits : cherry,banana,apple

关于spring-data-mongo 查询数组示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32297935/

相关文章:

spring - 使用 Spring Data Redis 进行文本搜索

java - 在 Spring Data Jpa Repository 而不是实体中设置表名称

java - 如何为嵌入式mongo(flapdoodle)全局设置WriteConcern以修复间歇性测试失败

java - 如何仅返回 Spring Data MongoDB 中查询的特定字段?

java - 如何编写更新嵌入文档的查询

java - 在 Spring Data Mongo 中设置自定义转换器

java - javax.persistence.Id 和 org.springframework.data.annotation.Id 有什么区别?

spring - 在 Spring 上实现 REST API 的两种方法

rxjs - 分页期间从 springframework.data.repository.reactive.ReactiveCrudRepository 返回 Mono 时出现 "Unsatisfied dependency"异常

java - mongodb org.springframework.data.authentication.UserCredentials 找不到默认构造函数