【问题标题】:Get only selective column in MongoDB在 MongoDB 中仅获取选择性列
【发布时间】:2014-02-10 08:55:19
【问题描述】:

仅显示集合中的选择性列

{
   "_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

【问题讨论】:

  • 请注意,您在多个 Area 字段中有多个 images。有没有你想得到的或全部
  • 是的,我只需要根据图像类型过滤特定图像。 Area 还集合,每个对象都有这个 X,Y 变量和图像集合 [在图像中有许多图像对象,每个图像对象都有图像 ID 和图像类型] 你能告诉如何设计方案并只过滤匹配的图像类型数据(FM ID,_id,图像类型)
  • 好的,很好。我在回答中有点同意,但部分聚合语句也会使事情进入一种状态,当我在 Schema 重新设计中放入时,您可以过滤两个嵌套数组。查看那里的示例文档并阅读链接的帖子。使用 $unwind 语句是可能的,因为字段不再包含静态子文档而是数组。灵活得多。点击 $match 链接并使用示例文档。

标签: java mongodb


【解决方案1】:

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

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

投影是键值对形式的DBObject。哪里,

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

有关详细信息,请参阅here

您可以使用 projection query 中的 'elemMatch' 限制要从数组返回的字段。

了解更多info

【讨论】:

  • 这种类型的投影不起作用。这个问题说(虽然不是很好)只有这三个领域。还有另一种方法可以做到这一点。
【解决方案2】:

首先,您的架构几乎肯定不是您希望能够以任何有意义的方式查询的内容。一切都在带有“伪数字”键的子文档中,这表明您确实需要数组并且您确实想要它们。

因此,我将考虑其余的答案,即您绝对更改架构的格式,如下例所示。其原因我在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 管道运算符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2023-03-31
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多