从mongo db获取数据就像我们进入mysql一样?

时间:2014-04-07 07:35:54

标签: java mysql mongodb

我正以这种方式向mongodb插入一些值。

    MongoClient mongo = new MongoClient( "localhost" , 27017 );
    DB db = mongo.getDB("test");
    DBCollection table = db.getCollection("paramDescMapper");
    String key = UUID.randomUUID().toString();
    String value = "{\"param0\":\"Car Make\",\"param1\":\"Car Model\",\"param2\":\"Car Variant\",\"param3\":\"Car Year\",\"param4\":\"Car Number\"}";
    JSONObject jsonObject = new JSONObject(value);

    // create a document to store key and value
    BasicDBObject document = new BasicDBObject();
    document.put("apiKey", key);
    document.put("apiParamDesc", jsonObject.toString());
    table.insert(document);

以这种方式插入数据。

{ "_id" : { "$oid" : "534251125f1ab7ec747298cd"} , "apiKey" : "1eb9b9e3-3af1-4b25-b7ea-1f2fcb1d9af6" , "apiParamDesc" : "{\"param0\":\"Car Make\",\"param1\":\"Car Model\",\"param2\":\"Car Variant\",\"param3\":\"Car Year\",\"param4\":\"Car Number\"}"}

现在我想使用apiKey获取apiParamDesc值。就像我们如何在mysql中获取数据一样。

  

选择apiParamDesc,其中apiKey =   ' 1eb9b9e3-3af1-4b25-b7ea-1f2fcb1d9af6&#39 ;;

我搜索了很多但找不到任何东西。这就是我试图获得这个apiParamDesc

的方法
    BasicDBObject whereQuery = new BasicDBObject();
    whereQuery.put("apiKey", "1eb9b9e3-3af1-4b25-b7ea-1f2fcb1d9af6");
    DBCursor cursor = table.find(whereQuery);
    while(cursor.hasNext()) {
        System.out.println(cursor.next());
    }

但这给了我整整一排。我只想在字符串中使用apiParamDesc。

请帮帮我。

由于

2 个答案:

答案 0 :(得分:1)

您可以使用聚合框架轻松完成此操作。以下是可以解决您的问题的示例:

// create our pipeline operations, first with the $match
DBObject match = new BasicDBObject("$match", new BasicDBObject("apiKey", "1eb9b9e3-3af1-4b25-b7ea-1f2fcb1d9af6"));

// build the $projection operation
DBObject fields = new BasicDBObject("apiParamDesc", 1);
fields.put("_id", 0);
DBObject project = new BasicDBObject("$project", fields );

 // run aggregation
AggregationOutput output = collection.aggregate( match, project);

您还可以仅使用db.coll.find(< criteria >, < projection >);

BasicDBObject query = new BasicDBObject(new BasicDBObject("apiKey", "1eb9b9e3-3af1-4b25-b7ea-1f2fcb1d9af6"), new BasicDBObject("apiParamDesc", 1).append("_id", 0));

//Which is equivalent to a follwoing query 
//'db.coll.find({"apiKey": "1eb9b9e3-3af1-4b25-b7ea-1f2fcb1d9af6"}, {"apiParamDesc": 1,"_id": 0});'

cursor = coll.find(query);

<小时/> 在"I want only apiParamDesc in a String."上更新你的另一件事是,如果你要存储像

这样的字符串
  

&#34; apiParamDesc&#34; :&#34; {\&#34; param0 \&#34;:\&#34; Car Make \&#34;,&#34; param1 \&#34;:\&#34; Car Model \&#34;,\&#34; param2 \&#34;:\&#34; Car Variant \&#34;,\&#34; param3 \&#34;:\&#34; Car Year \&#34;,\&#34; param4 \&#34;:\&#34;车号\&#34;}

您无法查询param0param1等子级别字段... 您的数据应如下所示:

{
   "_id":{
      "$oid":"534251125f1ab7ec747298cd"
   },
   "apiKey":"1eb9b9e3-3af1-4b25-b7ea-1f2fcb1d9af6",
   "apiParamDesc":{
      "param0":"Car Make",
      "param1":"Car Model",
      "param2":"Car Variant",
      "param3":"Car Year",
      "param4":"Car Number"
   }
}

答案 1 :(得分:0)

  

我只想在字符串中使用apiParamDesc。

但是,你不能得到一个只有apiParamDesc作为单个字段返回的文档(对象)(我的Java生锈了):

BasicDBObject whereQuery = new BasicDBObject();
whereQuery.put("apiKey", "1eb9b9e3-3af1-4b25-b7ea-1f2fcb1d9af6");

BasicDBObject fields = new BasicDBObject();
fields.put("apiParamDesc", 1);
fields.put("_id", 0);

DBCursor cursor = table.find(whereQuery, fields);
while(cursor.hasNext()) {
    System.out.println(cursor.next());
}