2013-03-01 83 views
0

我有一個蒙戈DB集合如圖MongoDB:如何在數組結構化集合中進行查詢。

{ 
    "name": "SAM", 
    "collection": [ 
     { 
      "date": "2013-03-16", 
      "values": [ 
       { 
        "price": "24.0" 
       } 
      ] 
     }, 
     { 
      "date": "2013-04-20", 
      "values": [ 
       { 
        "price": "10.0" 
       } 
      ] 
     }, 
     { 
      "date": "2013-05-18", 
      "values": [ 
       { 
        "price": "12.0" 
       } 
      ] 
     }, 
     { 
      "date": "2013-06-22", 
      "values": [ 
       { 
        "price": "10.0" 
       } 
      ] 
     }, 
     { 
      "date": "2013-09-21", 
      "values": [ 
       { 
        "price": "38.0" 
       } 
      ] 
     } 
    ] 
} 

我試圖讓如圖所示 與特定日期(2013年3月16日)的數據,但我得到的所有日期的數據。

這是我試過的。

請告訴我我在做什麼錯誤。

package com; 

import java.net.UnknownHostException; 

import com.mongodb.BasicDBObject; 
import com.mongodb.DB; 
import com.mongodb.DBCollection; 
import com.mongodb.DBCursor; 
import com.mongodb.Mongo; 

public class Test { 

    public static void main(String args[]) throws UnknownHostException { 
     Mongo mongo = new Mongo(); 
     DB db = mongo.getDB("test"); 
     DBCollection mycollection = db.getCollection("mycollection"); 

     BasicDBObject query = new BasicDBObject(); 
     query.put("name", "SAM"); 
     query.put("collection.date", "2013-03-16"); 

     DBCursor cursor = mycollection.find(query); 

     while (cursor.hasNext()) { 
      System.out.println(cursor.next()); 
     } 

    } 

} 
+0

的MongoDB將返回整個記錄未記錄的一個子集。上面的「收藏」看起來是單一的記錄。您可以嘗試將其分解爲單個記錄,每個記錄都有名稱,日期和值。 – 2013-03-01 19:37:25

+0

如果您需要爲模式使用嵌入式數組,您可以使用Aggregation Framework中的$ unwind運算符將單個文檔分解爲嵌入數組中的每個條目的文檔。 – slee 2013-03-01 19:41:10

+0

感謝您的迴應,但我無法更改數據庫的結構。所以你的意思是說不可能避免整個記錄返回。 – Pawan 2013-03-01 19:45:55

回答

1

您可以使用$位置投影算這樣做在find領域選擇參數:查詢時

BasicDBObject query = new BasicDBObject(); 
query.put("name", "SAM"); 
query.put("collection.date", "2013-03-16"); 
BasicDBObject fields = new BasicDBObject(); 
fields.put("name", 1); 
fields.put("collection.$", 1); 

DBCursor cursor = mycollection.find(query, fields); 
+0

這是行得通的,但請您告訴我爲什麼你已經硬編碼1的名稱和收集鍵? – Pawan 2013-03-01 19:55:18

+0

@PreethiJain因爲字段選擇參數中的鍵的值決定該字段是否包含在結果中; 1(或任何真值)包括在內,0爲排除。 – JohnnyHK 2013-03-01 19:58:53

+0

我的理解是,fileds名稱和集合。$將成爲結果的一部分?我對嗎 。請告訴我 – Pawan 2013-03-01 20:08:11

0

您試圖查詢數組集合中的元素,你需要使用$ elemMatch, 代替,

query.put("collection.date", "2013-03-16"); 

你可以用

query.put("collection", new BasicDBObject("$elemMatch", new BasicDBObject("date","2013-03-16"))); 

更多嘗試關於它在這裏:http://docs.mongodb.org/manual/reference/projection/elemMatch/

+0

感謝Vikas,我嘗試過,但我仍然得到所有的日期作爲迴應。 – Pawan 2013-03-01 19:48:49

+0

正如JohnnyHK在他的代碼中提到的那樣,您還需要傳遞新的BasicDBObject(「collection。$」,1);在獲取特定條目的find方法中,以下是$操作符的文檔:http://docs.mongodb.org/manual/reference/projection/positional/#_S_ – vikasing 2013-03-01 20:19:32

相關問題