在MongoDB中只获取选择性列

时间:2014-02-10 08:55:19

标签: java 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

2 个答案:

答案 0 :(得分:0)

要获取字段的投影,您应该传递DBObject进行投影,

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

投影是键值对形式的DBObject。其中,

键是您要投影的字段的名称。值可以是0或1。 0 - 表示从结果集中排除特定列。 1 - 表示在结果集中包含特定列。

有关详细信息,请参阅here

您可以使用投影查询中的“ elemMatch ”来限制从数组返回的字段。

了解更多info

答案 1 :(得分: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),但这是标准的shell形式:

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

通过这种方式,我们只能 您的响应中需要的三个字段。

如果您要查找文档结构中的特定条目,请查看$match管道运算符。