java - spring data mongodb 映射动态字段

标签 java spring mongodb spring-data spring-data-mongodb

我的 java 类中有这个模型

@Document
public class Template {

    private String type;

    private String code;

    @Version
    Long version;
}

我需要添加一个名为模板的新字段,并将该字段映射为动态字段,换句话说,我将像这样对文档进行建模

{
  _id: 'id' 
  type:'myType',
  code:'myCode'
  template:{
    someFiled:[
      {
        subField1:'value1',
        subField2:'value2'
      },
      {
        sub1Field1:'1value1',
        sub1Field2:'1value2'
      }
      .......................
    ],
    otherField:[
      {
        otherField1:'value1',
        otherField2:'value2'
      }
    ],
    .........
  },
  version:1000L
}

有什么方法可以将字段注释为动态吗?

解决方案

    @Document
    public class Template {

        private String type;

        private String code;

        private Map<String, Object> template;

        @Version
        Long version;
    }

最佳答案

我找到了一个完美的解决方案。以我的项目为例:

@Data
@Document(collection = "logs")
public class Log {
    @Id
    private String id;
    private Object data;

    // data field can be a string
    public void setData(String str) {
        data = str;
    }
    // data field can be a {}
    public void setData(JsonObject jsonObject) {
        data = new BasicDBObject(jsonObject.getMap());
    }
    // data can be a []
    public void setData(JsonArray jsonArray) {
        BasicDBList list = new BasicDBList();
        list.addAll(jsonArray.getList());
        data = list;
    }
}

data字段声明为Object类型,为其实现3种setter。

以下是测试用例:

@RunWith(SpringRunner.class)
@SpringBootTest
public class LogRepositoryTest {

    @Autowired
    private LogRepository logRepository;

    @Test
    public void test() {
        Log strLog = new Log();
        strLog.setData("string here");
        logRepository.save(strLog);
        Log objLog = new Log();
        objLog.setData(new JsonObject().put("key", "value").put("obj", new JsonObject()));
        logRepository.save(objLog);
        Log aryLog = new Log();
        aryLog.setData(new JsonArray().add("a").add("b").add("c"));
        logRepository.save(aryLog);
    }
}

结果:

{
        "_id" : ObjectId("5a09fa46a15b065268a0a157"),
        "_class" : "ltd.linkcon.spider.domain.Log",
        "data" : "string here"
}
{
        "_id" : ObjectId("5a09fa46a15b065268a0a158"),
        "_class" : "ltd.linkcon.spider.domain.Log",
        "data" : {
                "key" : "value",
                "obj" : [ ]
        }
}
{
        "_id" : ObjectId("5a09fa46a15b065268a0a159"),
        "_class" : "ltd.linkcon.spider.domain.Log",
        "data" : [
                "a",
                "b",
                "c"
        ]
}

关于java - spring data mongodb 映射动态字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37034497/

相关文章:

node.js - 使用 post api 将数据保存到 mongodb

node.js - 连接失败在 Node 应用程序中连接mongodb

java - 如何拦截Axis/Apache SOAP请求,我可以使用Log4J吗?

java - 如何在 eclipse 中安装 BoofCV?

java - 我如何解决在 android :onClick attribute? 的父或祖先上下文中找不到方法

spring - 更新 JPA(Hibernate) 实体 : transactional or non-transactional and why? 的更好方法是什么

spring 和 angular2 如何使用参数请求发布数据?

javascript - 如何使用node js mongoose保存后返回json数据

java - 如何实现用于过滤组合查看器中的元素的文本字段

java - Java Spring中的ActiveMQ数据持久化问题