Монго Вложенные запросы

0

Мне нужно запросить на основе ключа, что все одинаковое, скажем, следующий порядок, и этот заказ содержит три продукта. Мне нужно запросить заказы, у которых есть продукты, которые имеют определенный статус, равный true. Каждый продукт хранится с идентификатором mongo в качестве его ключа, поэтому я действительно не знаю его имени ключа. Пример: (очевидно, я сократил ключи)

{
  "_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" в качестве запроса статуса, он не вернет его.

Я не уверен, как это сделать, очевидно, что это не сработало, поэтому мой вопрос: как я могу сопоставлять несколько под-ключей массива объектов, которые я не знаю имени ключа?

Теги:
object
arrays

1 ответ

0

Вам нужен массив документов, а не объект с идентификатором в качестве его ключа. Оператор $ positional не работает с объектами.

{
  "_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')
);

Это обновляет только этот вспомогательный документ. Единственный раз, когда вы должны использовать объекты, - это знать, какие ключи будут. Как статус или адрес... но если ключ тоже переменный, он становится очень сложным, очень быстрым.

  • 0
    У меня нет контроля над тем, как он хранится, так что, к сожалению, это мне не очень помогает, я не могу изменить формат
  • 0
    Если у вас нет контроля над этим, нет никакого способа сделать это тогда. :( Кроме извлечения ВСЕХ документов и сортировки таким образом.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню