-1

我有这个简单的 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 函数和 map reduce 的内容,但可惜我并没有走得太远。我正在尝试为一个应用程序 ID 选择每个屏幕截图的所有中等图像。我不确定如何只返回每个屏幕截图的中等图像,仅此而已。有任何想法吗?任何指针都会很棒:)

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

4

1 回答 1

1

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

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

最终,您可能能够使用新的聚合框架来做这种事情,但它要到 2.2 才会发布。

于 2012-05-14T22:55:31.833 回答