2014-02-10 27 views
0

僅顯示選擇列集合MongoDB中僅獲得選擇性的列

{ 
    "_id": ObjectId("52f4a5ed07b0f7106a9d5e4c"), 
    "FM_ID":"1253", 
    "passwd": ".aDoSkljf_h+6589q76w3rJK", 
    "Area": { 
     "0": { 
       "X": "53543500", 
       "Y": "14031500", 
       "images": { 
          "0": { 
            "ImgId": ObjectId("52f4a5a107b0f7106a9d1a84"), 
            "ImageType": NumberInt(15) 
           }, 
          "1": { 
            "ImgId": ObjectId("52f4a5a107b0f7106a9d1a87"), 
            "ImageType": NumberInt(2) 
           } 
          } 
      }, 
     "1": { 

       "X": "53543500", 
       "Y": "14094572", 
       "images": { 
          "0": { 
            "ImgId": ObjectId("52f4a5a107b0f7106a9d1aa8"), 
            "ImageType": NumberInt(15) 
           }, 
          "1": { 
            "ImgId": ObjectId("52f4a5a107b0f7106a9d1aab"), 
            "ImageType": NumberInt(2) 
           } 

          } 
       }, 
     "2": { 
       "X": "53480464", 
       "Y": "14031500", 
       "images": { 
          "0": { 
            "ImgId": ObjectId("52f4a5a107b0f7106a9d1acc"), 
            "ImageType": NumberInt(15) 
           } 
          } 
      } 

     } 
} 

我想收集,只顯示選擇性數據

BasicDBObject有以下字段

B.append("FM_ID", 1); 
    B.append("_id", 1); 
    B.append("Area.$.$.images$.$.ImageType", 1); 

我的要求是隻顯示FM_ID,_id和ImageType

+0

請注意,您在多個「區域」字段中有多個「圖像」。是否有你想要得到的或**全部**其中有 –

+0

是我的需求僅根據圖像類型過濾特定圖像。面積也收集在每個對象有這個X,Y變量和圖像集合[在圖像有很多圖像對象,每個圖像對象有圖像ID和圖像類型],你可以告訴如何設計方案和只過濾匹配的圖像類型數據(FM ID,_id,圖片類型) – user3283282

+0

好,好。我在回答中遇到了這種情況,但部分聚合語句也會將事情置於一種狀態,在這種狀態下,您可以在嵌套數組上進行篩選,因爲我將模式重新設計。看看那裏的示例文檔並閱讀鏈接的文章。所使用的$ unwind語句是可能的,因爲這些字段不再包含靜態子文檔,而是包含數組。更靈活。按照$匹配鏈接並使用示例文檔進行播放。 –

回答

0

爲了獲得p字段rojection,你應該通過DBOBJECT用於投影,

DBCursor cursor = collection.find(query, projectionQuery); 

的投影是在DBOBJECT鍵 - 值對的表格。

key是要投影的字段的名稱。值可以是0或1. 0 - 表示從結果集中排除特定列。 1-手段包括結果集中的特定列。

欲瞭解更多信息,請參閱here

可以限制領域砥使用「elemMatch」從投影查詢返回數組。

欲瞭解更多info

+0

這種類型的投影不起作用。這個問題說(雖然不好)**只有**這三個領域。還有另一種方法可以做到這一點。 –

0

首先,您的模式幾乎肯定不是您想以任何有意義的方式查詢的內容。一切都在子文檔中,使用'僞 - 數字'鍵,這是一個肯定的信號,表明你實際上想要數組,並且你想要

所以,我會考慮其餘的答案,你絕對改變你的模式的格式,如下面的例子所示。這個原因我花了一些時間在this post解釋。

{ 
    "_id": ObjectId("52f4a5ed07b0f7106a9d5e4c"), 
    "FM_ID":"1253", 
    "passwd": ".aDoSkljf_h+6589q76w3rJK", 
    "Area": [ 
     { 
      "X": "53543500", 
      "Y": "14031500", 
      "images": [ 
       { 
        "ImgId": ObjectId("52f4a5a107b0f7106a9d1a84"), 
        "ImageType": NumberInt(15) 
       }, 
       { 
        "ImgId": ObjectId("52f4a5a107b0f7106a9d1a87"), 
        "ImageType": NumberInt(2) 
       } 
      ] 
     }, 
     { 

      "X": "53543500", 
      "Y": "14094572", 
      "images": [ 
       { 
        "ImgId": ObjectId("52f4a5a107b0f7106a9d1aa8"), 
        "ImageType": NumberInt(15) 
       }, 
       { 
        "ImgId": ObjectId("52f4a5a107b0f7106a9d1aab"), 
        "ImageType": NumberInt(2) 
       } 
      ] 
     }, 
     { 
      "X": "53480464", 
      "Y": "14031500", 
      "images": [ 
       { 
        "ImgId": ObjectId("52f4a5a107b0f7106a9d1acc"), 
        "ImageType": NumberInt(15) 
       } 
       ] 
      } 

    ] 
} 

現在,我們可以做更多更有意義的事情,如其他答案所述。但是對於這個,因爲你沒有告訴我們更多的東西,所以我們可以像提到的三個字段(_id,FM_ID,ImageType)一樣檢索數據。

由於這不能在標準查詢投影中完成,並且因爲您可能希望匹配某些值,所以最好的方法是通過aggregation pipeline運行。還有大量的Java文檔的這個(一切都只是無論如何DBOBJECT),但是這是標準的外殼形式:

db.collection.aggregate([ 
    {$unwind: "$Area" }, 
    {$project: { FM_ID: 1, ImageType: "$Area.images.ImageType" }}, 
    {$unwind: "$ImageType"} 
]) 

所以這樣我們就得到您在迴應希望這三個領域。

如果您正在尋找文檔結構中的特定條目,請查看$match管道運算符。