Mongo嵌套查询

时间:2015-02-19 05:59:53

标签: php arrays mongodb object

我需要根据所有相同的关键字进行查询,让我们说以下是订单,该订单包含三个产品。我需要查询具有特定状态等于true的产品的订单。每个产品都以mongo id作为密钥进行存储,因此我实际上并不知道它的关键名称,例如:(显然我已经缩短了密钥)

{
  "_id" : "foo",
  "products": {
    "123": {
      "status": {
        "a": false,
        "b": true,
        "c": true,
      },
    },
    "213": {
      "status": {
        "a": true,
        "b": true,
        "c": true,
      },
    },
    "321": {
      "status": {
        "a": false,
        "b": false,
        "c": true,
      },
    }
  },
}

以下是我尝试的内容:

$this->database->$collection->find(
    array('_id' => 'foo', 'products.$.status.c' => true)
);

我希望上述内容能够返回示例中的完整订单,作为状态' c'如果我要执行相同的查询,但是使用' a'或者' b'作为状态查询,它不会返回它。

我不确定如何做到这一点,显然上面没有用,所以我的问题是,如何匹配我不知道的对象数组的多个子键关键名称?

1 个答案:

答案 0 :(得分:0)

您需要一个文档数组,而不是一个以id作为键的对象。 $位置运算符不会处理对象。

{
  "_id" : "foo",
  "products": [
    {
      id: "123"
      "status": {
        "a": false,
        "b": true,
        "c": true,
      },
    },
    {
      id: "213"
      "status": {
        "a": true,
        "b": true,
        "c": true,
      },
    },
    {
      id: "321"
      "status": {
        "a": false,
        "b": false,
        "c": true,
      },
    }
  ]
}

您的查询需要如下所示:

$this->database->$collection->find(
    array('_id' => 'foo', 'products.status.c' => true)
);

这会将光标返回到第一个'产品'与您的查询匹配 并在udpate上。

$this->database->$collection->find(
    array('_id' => 'foo', 'products.status.c' => true),
    array('products.$.hello' => 'world')
);

仅更新该子文档。您应该使用对象的唯一时间是您知道密钥是什么。就像状态或地址一样......但如果密钥也是一个变量,那么它变得非常棘手,非常快。