我的应用程序经常使用JSON对象(org.JSON.JSONArray和friends).将这些存储到Mongo DBObjects中以便查询它们的最有效方法是什么?BasicDBObject无法序列化JSONArray——这两个层次 struct 之间似乎根本没有互操作性.

推荐答案

好吧,似乎没有互操作性,所以我推出了自己的.绕过类型系统的繁忙工作:

public class Util {
    public static DBObject encode(JSONArray a) {
        BasicDBList result = new BasicDBList();
        try {
            for (int i = 0; i < a.length(); ++i) {
                Object o = a.get(i);
                if (o instanceof JSONObject) {
                    result.add(encode((JSONObject)o));
                } else if (o instanceof JSONArray) {
                    result.add(encode((JSONArray)o));
                } else {
                    result.add(o);
                }
            }
            return result;
        } catch (JSONException je) {
            return null;
        }
    }

    public static DBObject encode(JSONObject o) {
        BasicDBObject result = new BasicDBObject();
        try {
            Iterator i = o.keys();
            while (i.hasNext()) {
                String k = (String)i.next();
                Object v = o.get(k);
                if (v instanceof JSONArray) {
                    result.put(k, encode((JSONArray)v));
                } else if (v instanceof JSONObject) {
                    result.put(k, encode((JSONObject)v));
                } else {
                    result.put(k, v);
                }
            }
            return result;
        } catch (JSONException je) {
            return null;
        }
    }
}

Mongodb相关问答推荐

Mongodb如果数组中有外部键,则将排序应用到查找结果

在MondoDB中:将对象数组从切片索引数组切片,并通过聚合推入数组

DTO 验证适用于 POST,但不适用于 PUT

Mongodb聚合查找连接两个对象字段的集合数组匹配对象索引字段的总和

使用 mgo 从 golang 中的 Mongodb 中 Select 列

如何根据_id删除文档?

db.createCollection 不是函数

为什么mongodb的文档中存储键名

如何在 MongoDb 中进行类似于嵌套 Sql Select 查询的嵌套查询

加载时将 mongo 存储的日期转换回自 Unix 纪元以来的毫秒数?

如何更新 mongodb 文档以向数组添加新元素?

使用 nodejs/mongoose 部分更新子文档

升级mongodb

MongoDB:在集合上设置 TTL 索引时出错: sessions

MongoDB count() 未定义

MongoDB的数据库管理工具

MongoDB:查询和检索嵌入式数组中的对象?

mongo中的稀疏索引和空值

带有 either or查询的mongoose findOne

MongoDB Compass timeouts超时