【问题标题】:Indexing mongodb json document java driver索引mongodb json文档java驱动
【发布时间】:2015-11-01 12:11:12
【问题描述】:

我在名为 GOT 的 mongo db 集合中有以下几个 json 文档,我想在 GOT 集合中的每个文档中索引嵌套数组 metaTag 数组元素。

Json document

我尝试了以下方法:

 BasicDBObject index = new BasicDBObject("season.questions.questionEntry.metaTags",1);
 mongoColl.createIndex(index);

我不确定这个点表示法是否是在我的 json 文档中识别要索引的元素的正确方法? 如何判断索引是否创建成功?

编辑:添加了我的查询:

     // Query our collection documents metaTag elements for a matching string
// @SuppressWarnings("deprecation")
public void queryMetaTags(String query)
{
    // Query to search all documents in current collection
    List<String> continentList = Arrays.asList(new String[]{query});
    DBObject matchFields = new 
       BasicDBObject("season.questions.questionEntry.metaTags", 
      new BasicDBObject("$in", continentList));
    DBObject groupFields = new BasicDBObject( "_id", "$_id").append("questions", 
       new BasicDBObject("$push","$season.questions"));
    //DBObject unwindshow = new BasicDBObject("$unwind","$show");
    DBObject unwindsea = new BasicDBObject("$unwind", "$season");
    DBObject unwindepi = new BasicDBObject("$unwind", "$season.questions");
    DBObject match = new BasicDBObject("$match", matchFields);
    DBObject group = new BasicDBObject("$group", groupFields); 
    @SuppressWarnings("deprecation")
    AggregationOutput output = 
    mongoColl.aggregate(unwindsea,unwindepi,match,group);

    String jsonString = null;
    JSONObject jsonObject = null;
    jsonResultsArray = null;
    ourResultsArray = new ArrayList<JSONObject>();

    // Loop for each document in our collection
    for (DBObject result : output.results()) 
    {       
        try 
        {
            // Parse our results so we can add them to an ArrayList
            jsonString = JSON.serialize(result);             
            jsonObject = new JSONObject(jsonString);
            jsonResultsArray = jsonObject.getJSONArray("questions");

            // Put each of our returned questionEntry elements into an ArrayList
            for (int i = 0; i < jsonResultsArray.length(); i++)
            {
                System.out.println("jsonResultsArray element (" + i + "): " + jsonResultsArray.getJSONObject(i).toString());
                ourResultsArray.add(jsonResultsArray.getJSONObject(i));         
                //System.out.println("ourResultsArray element (" + i + "): " + ourResultsArray.get(i).toString());
            }
        } 
        catch (JSONException e1) 
        {
            e1.printStackTrace();
        }
    }   
}

【问题讨论】:

标签: java json mongodb indexing


【解决方案1】:

您可以使用以下 Java 代码来索引所需的键:

Mongo mongo = new Mongo("localhost", 27017);
    DB db = mongo.getDB("dbName"); //set dbname name here

    DBCollection collection = db.getCollection("collectionName");
    collection.createIndex(new BasicDBObject("season.questions.questionEntry.metaTags",1));

Here 是关于索引的详细信息。

【讨论】:

  • @Vishwas 感谢您的回复,因为我不确定点符号的用法是否正确。一个问题虽然在这个集合中尝试了这种对我的文档进行索引的方法(参见上面链接中的示例),但没有性能差异!所以我想知道这是否正常工作?
  • 性能取决于您用于索引和查询的字段。您需要在正确的字段上创建索引以提高性能。您可以在查询中使用.explain("executionStats") 以获取有关索引使用的详细信息。例如db.collection.find({your query}).explain("executionStats")
  • 我添加了复杂的查询,但不确定如何使用此类查询生成执行统计信息?
  • 如果是聚合则在管道之后使用explain:true。对于简单的find,然后使用上面给定的语法。
  • @Vishwas 哈哈我不是这个查询的作者 - 你能解释一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多