У меня есть документ в MongoDB, и я пытаюсь развернуть его на PHP. Я хочу размотать документ, в котором есть поддокумент, содержащий еще один дополнительный документ. Я смог сделать это успешно, если документ содержит только строки и числа, но если он содержит другой подзадач, я не могу заставить его работать. Я получаю эту ошибку:
exception: $unwind: value at end of field path must be an array
Не можете ли вы развернуть поддокумент, содержащий другой уровень поддокумента? Если нет, как бы вы это сделали?
Заранее спасибо!
Это запрос:
$project = array( '$project' => array( '_id' => 1, 'items' => 1, ) ); $unwind = array( '$unwind' => '$items' ); $query = $mongo->store->aggregate($project,$unwind_items);
Это структура:
{ "_id": { "$oid": "526fdc1fd6b0a8182300009c" }, "items": [ { "quantity": "1", "category_id": { "$oid": "526fdc1fd6b0a81823000029" }, "category": "test", "images": [ { "name": "9by9easy.PNG", "path": "upload_files/nibh-vulputate-mauris-corporation/", "file_path": "upload_files/nibh-vulputate-mauris-corporation/68e7c50bde1476e96ca2461dc553cce5528fb70e41b1f.PNG", "size": 8761 }, { "name": "9by9hard.PNG", "path": "upload_files/nibh-vulputate-mauris-corporation/", "file_path": "upload_files/nibh-vulputate-mauris-corporation/8cd2dcf4fcd476262db2eba3fdb2c39a528fb70e42757.PNG", "size": 11506 } ], "link": "fghfhfhfg" } ], "name": "Nibh Vulputate Mauris Corporation", }
Я знаю, что то, что вы пытаетесь сделать, возможно с MongoDB. Команда aggregate()
может принимать столько аргументов, сколько вам нужно.
В оболочке mongo такая команда
db.collection.aggregate( { $project: { _id: 1, items: 1 } }, { $unwind: '$items' }, { $unwind: '$items.images' } );
будет разворачивать поддокументы items
, а затем поддокусы images
.
На основе кода в вашем вопросе, возможно, это сработает
$project = array( '$project' => array( '_id' => 1, 'items' => 1, ) ); $unwind_items = array( '$unwind' => '$items' ); $unwind_images = array( '$unwind' => '$items.images' ); $query = $mongo->store->aggregate($project,$unwind_items,$unwind_images);