0

这是 products 集合中的文档示例。

object(MongoId)#8 (1) {
  ["$id"]=>
  string(24) "5165b2c8ac951ab812000001"
}
int(0)
array(7) {
  [0]=>
  array(2) {
    ["sValue"]=>
    string(10) "1223828372"
    ["iPosX"]=>
    int(0)
  }
  [1]=>
  array(2) {
    ["sValue"]=>
    string(12) "Epson EB-S11"
    ["iPosX"]=>
    int(1)
  }
  [2]=>
  array(2) {
    ["sValue"]=>
    string(6) "Beamer"
    ["iPosX"]=>
    int(2)
  }
  [3]=>
  array(2) {
    ["sValue"]=>
    string(48) "TV>>Beamer & Projektoren|Epson EB-S11-1300742000"
    ["iPosX"]=>
    int(3)
  }
  [4]=>
  array(2) {
    ["sValue"]=>
    string(6) "398.00"
    ["iPosX"]=>
    int(4)
  }
  [5]=>
  array(2) {
    ["sValue"]=>
    string(85) "http://www.myshop.com/product-1223828372.html"
    ["iPosX"]=>
    int(5)
  }
  [6]=>
  array(2) {
    ["sValue"]=>
    string(5) "Epson"
    ["iPosX"]=>
    int(6)
  }
}

我想选择此集合中的产品,但不是所有子文档。例如:我只想从这个文档中获取 iPosX 为 1、2 或 4 的子文档。

具体来说:我需要此产品的所有信息以及 iPosX 字段为 1、2 或 4 的子文档。

我怎样才能做到这一点?

提前致谢。最大限度

4

1 回答 1

1

您最好的方法是使用MongoDB 2.2+ 中的聚合框架:

db.products.aggregate(
    // Optional: could include a $match to limit the matching documents

    // Create a stream of documents from the products array
    { $unwind: "$products" },

    // Filter the matching products
    { $match: {
        "products.iPosX": { $in: [1,2,4] }
    }},

    // Reshape output so matched products are at top level of results
    { $project: {
        _id: 0,
        sValue: "$products.sValue",
        iPosX:  "$products.iPosX",
    }}
)

示例输出:

{
    "result" : [
        {
            "sValue" : "Epson EB-S11",
            "iPosX" : 1
        },
        {
            "sValue" : "Beamer",
            "iPosX" : 2
        },
        {
            "sValue" : "398.00",
            "iPosX" : 4
        }
    ],
    "ok" : 1
}
于 2013-04-13T12:19:14.360 回答