mongodb - 查询嵌入式文档 - 仅返回嵌入式集合中每个软件的中型屏幕截图

时间:2012-05-14 21:52:09

标签: mongodb nosql

我有这个简单的mongo系列:

{
  "_id": ObjectId("4fb176f964debef01e000000"),
  "applicationId": NumberInt(1),
  "screenshots": [
    {
      "caption": "ddd",
      "images": [
        {
          "size": "large",
          "file": {
            "$ref": "File",
            "$id": ObjectId("4fb176f964debef01e000001"),
            "$db": "flukeytest"
          }
        },
        {
          "size": "medium",
          "file": {
            "$ref": "File",
            "$id": ObjectId("4fb176f964debef01e000002"),
            "$db": "flukeytest"
          }
        },
        {
          "size": "small",
          "file": {
            "$ref": "File",
            "$id": ObjectId("4fb176f964debef01e000003"),
            "$db": "flukeytest"
          }
        }
      ]
    },
    {
      "caption": "tetsss",
      "images": [
        {
          "size": "large",
          "file": {
            "$ref": "File",
            "$id": ObjectId("4fb1771164debe9c1a000000"),
            "$db": "flukeytest"
          }
        },
        {
          "size": "medium",
          "file": {
            "$ref": "File",
            "$id": ObjectId("4fb1771164debe9c1a000001"),
            "$db": "flukeytest"
          }
        },
        {
          "size": "small",
          "file": {
            "$ref": "File",
            "$id": ObjectId("4fb1771164debe9c1a000002"),
            "$db": "flukeytest"
          }
        }
      ]
    }
  ]
}

我一直在阅读很多关于$ where功能和地图缩小的内容,但是唉,我没有走得太远。我正在尝试为每个应用程序ID选择每个屏幕截图的所有中等图像。我不确定如何才能返回每个屏幕截图的媒体图像,而不是其他内容。有任何想法吗?任何指针都会很棒:)

编辑:db.Screenshot.find({ "applicationId": 1, "$where": "function() { return this.screenshots.images.size == 'medium'; }" }).sort([ ]);我已经走到了这一步,但它不起作用。唉。仍在阅读我可以在谷歌上找到的所有内容。

1 个答案:

答案 0 :(得分:1)

为什么您尝试仅返回中等屏幕截图?是出于性能原因吗?如果每个applicationId有一个文档,那么仅返回中等屏幕截图(例如,MongoDB将从磁盘加载相同数量的物理IO加载数据)将不会更有效。在这种情况下,MongoDB与RDBMS有很大的不同。

除非相关文档很大,并且您尝试在一个查询中返回许多应用程序的中型屏幕截图,否则将没有太多(如果有)性能优势。我建议您只是通过applicationId查询文档,然后在代码中过滤掉您想要的屏幕截图。

最终,您可能会使用新的aggregation framework执行此类操作,但直到2.2才会发布。