【问题标题】:Jongo vs (DBObject)JSON.parseJongo vs (DBObject)JSON.parse
【发布时间】:2013-01-02 22:58:10
【问题描述】:

我试图找出 Jongo 的优势,而不是简单地使用 (DBObject)JSON.parse(...) 解组 json 命令并以以下方式使用 DBObject。

有性能优势吗?

    @Override
public List<T> getEntityList(Integer limit, String query) throws Exception {
    log.entering(DaoImpl.class.toString(), "getEntityList, with criteria of " + query);
    DBObject criteriaObject = null;
    ArrayList<T> list = new ArrayList<T>();

    if (query != null)
        criteriaObject = (DBObject)JSON.parse(query);

    DBCursor cursor = null;

    try {
        if (criteriaObject != null) {
            log.log(Level.FINEST, "getting the objects using a search criteria: " + criteriaObject);
            cursor = MongoDB.getInstance().getCollection(collection).find(criteriaObject);
        } else {
            log.log(Level.FINEST, "getting the objects without a criteria");
            cursor = MongoDB.getInstance().getCollection(collection).find();
        }

        ............etc, etc, etc

谢谢!

【问题讨论】:

    标签: java mongodb jongo


    【解决方案1】:

    Jongo .3 使用相同的 JSON.parse(query) 解组 Mongo 查询。优点是您从数据库中获取结果的方式。在您的示例中,您必须遍历游标,自己调整每个属性和子属性。

    DBObject dbo = JSON.parse("{age: 18}");
    DBCursor results = users.find(dbo);
    for (DBObject result : results) {
        User user = new User();
        user.setUsername((String) result.get("username"));
        user.setAge((Integer) result.get("age"));
        user.setAddress(new Address(..));
    }
    

    使用 Jongo,您可以直接操作对象:

    Iterable<User> users = collection.find("{age: 18}").as(User.class);
    

    Jongo 的表现几乎与车手相当。

    【讨论】:

    • 我使用 gson 来解组响应,所以我不需要自己设置每个属性。 Jongo 还遍历每个结果并使用 JSON 对其进行解组。所以这不是问题: new DomainConverter(clazz).getObject(entity.toString())
    • 您使用 GSON 解组 DBCursor 响应?您能否展示一个完整的代码示例? Jongo 团队一直在努力使解组步骤与驱动程序一样高效。您计算过解决方案的性能吗?
    • 我不是解组游标,而是解组游标返回的 DBObject。
    【解决方案2】:

    这里列出了使用 jongo 的几个优点:

    • 几乎所有查询都可以模板化:

      friends.find("{name:#, age:#}", "Joe", 18)
      
    • 绑定参数可以是 BSON Primitives 或任何复杂类型:

      friends.find("{address: #}", new Address(..)); 
      
    • 查询和解组与驱动程序一样快。没有杰克逊流程的额外费用
    • 使用 Jackson 功能映射您的 Pojo:多态性、JsonView...

    顺便说一句,您的 GSON un/marshaller 可以通过实现 Mapper 集成到 Jongo 中。

    【讨论】:

    • 模板确实简化了一些事情,但我仍然认为这不是切换到 jongo 的充分理由——这可以通过字符串替换轻松实现。无论如何,如果没有其他人提供更好的答案,我会接受你的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多