Найти документ по полю в подмассиве и вернуть другое поле в том же массиве - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть коллекция с именем products, в которой есть документы, содержащие несколько полей, а также подмассив variants.

Подмассивы variants имеют несколько полей, в том числе sku и id.

Я знаю значение id, и мне нужно использовать его, чтобы получить значение sku.

Упрощенная коллекция выглядит так:

[
    "_id"      => "whatever_id_1",
    "field_2"  => "some value 1",
    "variants" => 
        [
            "id"  => "some_id_123"
            "sku" => "SKU-1"
        ],
        [
            "id"  => "some_id_124"
            "sku" => "SKU-2"
        ],
        [
            "id"  => "some_id_125"
            "sku" => "SKU-3"
        ]
],
[
    "_id"      => "whatever_id_2",
    "field_2"  => "some value 2",
    "variants" => 
        [
            "id"  => "some_id_126"
            "sku" => "SKU-4"
        ],
        [
            "id"  => "some_id_127"
            "sku" => "SKU-5"
        ],
        [
            "id"  => "some_id_128"
            "sku" => "SKU-6"
        ]
],
[
    "_id"      => "whatever_id_3",
    "field_2"  => "some value 3",
    "variants" => 
        [
            "id"  => "some_id_129"
            "sku" => "SKU-7"
        ],
        [
            "id"  => "some_id_130"
            "sku" => "SKU-8"
        ],
        [
            "id"  => "some_id_131"
            "sku" => "SKU-9"
        ]
]

Я получаю правильный документ с

// Set item_id
$item_id = 'some_id_127';
// Build 'find product with inventory item id' query
$find_product_with_id_query = [ 'variants' => ['$elemMatch' => ['id' => $item_id] ] ];
// Get the product document to process 
$inventory_update_product = $client_products_collection->findOne($find_product_with_id_query);

Это правильно возвращает родительский документ с "_id" => "whatever_id_2".

Теперь я знаю, что могу перебрать эти результаты (например, $inventory_update_product['variants') и найти значение sku таким образом.

ВОПРОСЫ
1. Но есть ли способ получить значение sku с помощью MongoDB?
2. Есть ли какая-то польза от использования MongoDB для этого последнего шага или более эффективно просто использовать PHP for loop, чтобы найти sku?

1 Ответ

0 голосов
/ 09 сентября 2018

Да, на самом деле. Вы можете использовать проекцию:

// Set item_id
$item_id = 'some_id_127';

// Build 'find product with inventory item id' query
$find_product_with_id_query = [ 'variants' => ['$elemMatch' => ['id' => $item_id] ] ];

// Project and limit options
$options = [
    'projection' => [ 'variants.$' => 1 ],
    'limit' => 1
];

// Get the product document to process 
$inventory_update_product = $client_products_collection->find($find_product_with_id_query, $options);

Будет возвращен курсор, содержащий документ с массивом variants, в котором только тот элемент соответствует тому, который вы искали.

Точный синтаксис может различаться в зависимости от версии драйвера и от того, используете ли вы пользовательскую библиотеку или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...