Ошибка поиска Pymongo с использованием индекса массива, поскольку ключ может быть только строкой - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь найти все документы со строкой "комментария" в Поле «КОММЕНТАРИЙ» из документов, которые выглядят примерно так

{
    "_id": "5d10aaf8130d5f9e386be977",
    "info": {
        "files": ["filename"],
        "bands": [{
            "metadata": {
                "": {
                    "COMMENT": "comment"
                }
            }
        }]
    },
    "file": "filename"
}

Я пробовал этот запрос, и все, казалось, работало просто отлично

    comment = coll.find(
        {"info":
            {"bands":
                {"$elemMatch": 
                    { "0":
                        {"metadata":
                            {"":
                                {"COMMENT":
                                    {
                                    "comment"   
                                    }
                                }
                            }    
                        }
                    }
                }
            }
        }
    )

Если я пытаюсь посмотреть на спецификацию курсора, я вижу в нем атрибут "set", хотя понятия не имею, почему.

    > _Cursor__spec:{'info': {'bands': {...}}} 'info':{'bands': {'$elemMatch': {...}}} 'bands':{'$elemMatch': {'0': {...}}}
    > '$elemMatch':{'0': {'metadata': {...}}} '0':{'metadata': {'': {...}}}
    > 'metadata':{'': {'COMMENT': set([...])}} '':{'COMMENT':
    > set(['comment'])} 'COMMENT':set(['comment'])
    > 63587936:'comment'

Наконец, если я попытаюсь сделать

    while (comment.next()):
        print(anything)

Я получаю следующую ошибку:

bson.errors.InvalidDocument: невозможно кодировать объект: set (['comment']), типа:

Если я изменю следующую часть запроса

{"$elemMatch": { "0":

до

{"$elemMatch": { 0:

или даже просто

{ 0:

Ошибка меняется на (курсор остается с атрибутом "set"):

bson.errors.InvalidDocument: документы должны иметь только строковые ключи, ключ было 0

P.S .: Я пробовал другие запросы, которые не включали массивы или сложное вложение без каких-либо проблем

1 Ответ

0 голосов
/ 28 июня 2019

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

    comment = coll.find({"info.bands.metadata."".COMMENT":"comment"})
...