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

{ 
        "_id" : ObjectId("5a841ac387c7d70ad36f5ce2"), 
        "user_type" : "retail", 
        "first_name" : "Mayank", 
        "last_name" : "Garg", 
        "addressbook" : {
            "5a93d64187c7d71562433a22" : {
                "consignee_name" : "Jerry Day", 
                "first_name" : "Cole", 
                "last_name" : "Bean", 
                "mobile" : "33333333333333", 
                "street_address" : "", 
                "street_address2" : "", 
                "city" : "", 
                "zip_code" : "58694", 
                "select_country" : "India", 
                "default_billing" : true
            }, 
            "5a9400f887c7d70aac2908e2" : {
                "consignee_name" : "Jerry Day", 
                "first_name" : "Cole", 
                "last_name" : "Bean", 
                "mobile" : "33333333333333", 
                "street_address" : "", 
                "street_address2" : "", 
                "city" : "",  
                "select_state" : "Delhi", 
                "zip_code" : "78004", 
                "select_country" : "India"
            }
        }
    }

Я пробовал это

db.collection.find( {
 addressbook: {
 $all: [ { "$elemMatch" : { default_billing: true } } ]
 }
 } )
2
g1ji 27 Фев 2018 в 12:35

1 ответ

Лучший ответ

Вы можете использовать $objectToArray для создания массива объектов, применить фильтр к массиву и использовать $arrayToObject для обратного преобразования массива в объект. Если в документе не найдено совпадений, адресная книга будет пустым объектом. Мы можем добавить $match в качестве следующего этапа, чтобы удалить их, если это необходимо.

db.collection.aggregate([{
    $addFields: {
        addressbook: {
            $objectToArray: '$addressbook'
        }
    }
}, {
    $addFields: {
        addressbook: {
            $filter: {
                input: '$addressbook',
                as: 'ab',
                cond: {$eq: ['$$ab.v.default_billing', true]}
            }
        }
    }
}, {
    $addFields: {
        addressbook: {
            $arrayToObject: '$addressbook'
        }
    }
}]);
2
RaR 27 Фев 2018 в 13:05