Pymongo 使用数组索引查找查询失败,因为键只能是字符串

Posted

技术标签:

【中文标题】Pymongo 使用数组索引查找查询失败,因为键只能是字符串【英文标题】:Pymongo find query using array index failed as key can be string only 【发布时间】:2019-11-09 15:35:52 【问题描述】:

我正在尝试查找所有包含“comment”字符串的文档 看起来像这样的文档中的“COMMENT”字段


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

我试过这个查询,一切似乎都很好

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

如果我尝试查看光标规范,我会在其中看到“设置”属性,但我不知道为什么。

    > _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.:我尝试了其他不包含数组或复杂嵌套的查询没有任何问题

【问题讨论】:

您的搜索包含“评论]”(带有“]”)。是不是搞错了? 是的,我在 Stack 上写错字了,我会改正的,谢谢! 【参考方案1】:

看来我需要忽略数组索引并使用不同的语法来实现结果

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

【讨论】:

以上是关于Pymongo 使用数组索引查找查询失败,因为键只能是字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle 查询中查找传递数组中某个值的索引

mongoDB:从 pymongo 查询时失败分组

使用 pymongo 在 mongoDB 中查找

使用 flask_pymongo 时身份验证失败

使用 python 和 pymongo 的 MongoDB 位置运算符索引问题

如何运行 Presto 查询查找行数组中元素的索引