Мне нужно запросить на основе ключа, что все одинаковое, скажем, следующий порядок, и этот заказ содержит три продукта. Мне нужно запросить заказы, у которых есть продукты, которые имеют определенный статус, равный 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" в качестве запроса статуса, он не вернет его.
Я не уверен, как это сделать, очевидно, что это не сработало, поэтому мой вопрос: как я могу сопоставлять несколько под-ключей массива объектов, которые я не знаю имени ключа?
Вам нужен массив документов, а не объект с идентификатором в качестве его ключа. Оператор $ 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')
);
Это обновляет только этот вспомогательный документ. Единственный раз, когда вы должны использовать объекты, - это знать, какие ключи будут. Как статус или адрес... но если ключ тоже переменный, он становится очень сложным, очень быстрым.