Как использовать PyMongo find () для поиска атрибута вложенного массива? - PullRequest
0 голосов
/ 21 ноября 2018

Используя PyMongo, как найти / найти документы, в которых объект json для вложенного массива соответствует заданной строке.

С учетом следующих двух документов JSON продукта в коллекции MongoDB ..

[{
    "_id" : ObjectId("5be1a1b2aa21bb3ceac339b0"),
    "id" : "1",
    "prod_attr" : [ 
        {
            "name" : "Branded X 1 Sneaker"
        },  
        {
            "hierarchy" : {
                "dept" : "10",
                "class" : "101",
                "subclass" : "1011"
            }
        }
    ]
},
{
    "_id" : ObjectId("7be1a1b2aa21bb3ceac339xx"),
    "id" : "2",
    "prod_attr" : [ 
        {
            "name" : "Branded Y 2 Sneaker"
        },  
        {
            "hierarchy" : {
                "dept" : "10",
                "class" : "101",
                "subclass" : "2022"
            }
        }
    ]
}
]

Я хотел бы 1. вернуть все документы, где prod_att.hierarchy.subclass = "2022" 2. вернуть все документы, где prod_attr.name содержит "Sneaker"

Я понимаю, что JSON может быть структурирован по-другомуК сожалению, это не в моих силах измениться.

1 Ответ

0 голосов
/ 21 ноября 2018

1.Вернуть все документы, где prod_attr.hierarchy.subclass = "2022"

На основе запроса массива встроенных документов документации MongoDB вы можете использовать точечную запись, объединяющую имя поля массива (prod_attr), с точкой (.) и именем поля во вложенном документе (hierarchy.subclass):

collection.find({"prod_attr.hierarchy.subclass": "2022"})

2.Вернуть все документы, в которых prod_attr.name содержит «Sneaker»

Как и раньше, вы можете использовать точечную запись для запроса поля вложенного элемента внутри массива.Для выполнения запроса «содержит» вы должны использовать оператор $regex:

collection.find({"prod_attr.name": {"$regex": "Sneaker"}})

Другой вариант - использовать MongoDB Aggregation framework :

collection.aggregate([
    {"$unwind": "$prod_attr"},
    {"$match": {"prod_attr.hierarchy.subclass": "2022"}}
])

оператор $unwind создает новый объект для каждого объекта в массиве prod_attr, поэтому у вас будут только вложенные документы и никакой массив (см. Документацию длядетали).
Следующим шагом является оператор $match, который фактически выполняет запрос к вложенному объекту.

Это простой пример, но вы играете с Aggregators Operators , которые у вас естьбольшая гибкость.

...