簡體   English   中英

如何在 MongoDB PHP 的集合中獲取嵌套在文檔內的 object 值

[英]How to get a object value nested inside document in a collection in MongoDB PHP

我已經在 MongoDB 中存儲了一個文檔集,如下所示,其中 ID 是通過 PHP 自動生成的

{
"_id": {
    "$oid": "5ff745237d1b0000860007a6"
},
"user": "5ff741fb7d1b0000860007a4",
"name": "Test",
"slug": "fed73b70d080584c21e0a4353825ef91",
"category": "5fef4a467d1b000086000745",
"images": [{
    "100x128": "test/year/month/image_da4181762396a31ff44f5ddc08ce6186.jpeg",
    "200x256": "test/year/month/image_da4181762396a31ff44f5ddc08ce6186.jpeg",
    "300x385": "test/year/month/image_da4181762396a31ff44f5ddc08ce6186.jpeg",
    "500x642": "test/year/month/image_da4181762396a31ff44f5ddc08ce6186.jpeg"
},
{
    "100x128": "test/year/month/image_da4181762396a31ff44f5ddc08ce6186.jpeg",
    "200x256": "test/year/month/image_da4181762396a31ff44f5ddc08ce6186.jpeg",
    "300x385": "test/year/month/image_da4181762396a31ff44f5ddc08ce6186.jpeg",
    "500x642": "test/year/month/image_da4181762396a31ff44f5ddc08ce6186.jpeg"
}],
}

現在的問題是我想從第一個數組的鍵100x128images object中獲取值。

我正在使用下面的代碼來實現

$productsArray = $collection->aggregate(
    [
        [
            '$match' => [
                                    'user_id' => $user_id
                                ]
        ],
        [ '$unwind' => '$images' ],
        [ '$unwind' => '$images.100x128' ],
        [
            '$project' =>   [
                                        'name' => 1,
                                        'image' => '$images'
                                    ]
        ]
    ]
 );

我總是得到一個 output 如下

MongoDB\Model\BSONDocument Object
(
   [storage:ArrayObject:private] => Array
    (
        [_id] => MongoDB\BSON\ObjectId Object
            (
                [oid] => 5ff745357d1b0000860007a7
            )

        [name] => Test 1
        [image] => MongoDB\Model\BSONDocument Object
            (
                [storage:ArrayObject:private] => Array
                    (
                        [100x128] => test/year/month/image_da4181762396a31ff44f5ddc08ce6186.jpeg
                        [200x256] => test/year/month/image_da4181762396a31ff44f5ddc08ce6186.jpeg
                        [300x385] => test/year/month/image_da4181762396a31ff44f5ddc08ce6186.jpeg
                        [500x642] => test/year/month/image_da4181762396a31ff44f5ddc08ce6186.jpeg
                    )

            )

    )

)

我不確定如何獲得該特定值。 我在哪里錯了?

就我收到您的問題而言,您似乎需要了解 mongo 概念。 因此,您可能會在 UI 或 PHP 中獲得數組表示,但最終它是 object。

仔細查看您發布的格式,object 中沒有數組,但有多個{} ,就像 JS 一樣,所以在這里忘記數組概念。

如果我的理解是正確的,這就是你要找的

$productsArray = $collection->aggregate(
[
    [
        '$match' => [
                       'user_id' => $user_id
                    ]
    ],
    [ '$unwind' => '$images' ],
    [ '$unwind' => '$images.100x128' ],
    [
        '$project' =>   [
                           'name' => 1,
                           'image' => '$images.100x128'
                        ]
    ]
]

);

無論您使用谷歌搜索或使用它都是正確的,您只需在$project變量中添加第二個展開值,即$images.100x128而不是$images

您可以這樣理解$unwind變量使用遞歸邏輯來根據需要獲取 output 。 就像假設您在數組中首先有一個數組,它將從內部數組中獲取值,然后它將到達父數組,然后依此類推。 所以應該使用$unwind變量中的最后一個值。

我不確定它是否適用於多個對象,但正如您所說,您只需要第一個。 這應該有魅力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM