为什么这个 pymongo 子文档找不到工作?

问题描述

我正在考虑使用 mongodb 以及到目前为止我尝试过的大多数东西。但我不知道为什么这个发现不起作用。

col = db.create_collection("test")
x = col.insert_many([
    {"item": "journal","qty": 25,"size": {"h": 14,"w": 21,"uom": "cm"},"status": "A"},{"item": "notebook","qty": 50,"size": {"h": 8.5,"w": 11,"uom": "in"},{"item": "paper","qty": 100,"status": "D"},{"item": "planner","qty": 75,"size": {"h": 22.85,"w": 30,{"item": "postcard","qty": 45,"size": {"h": 10,"w": 15.25,"status": "A"}
])

cursor = col.find({"size": {"h": 14,"uom": "cm"}})
if cursor.retrieved == 0:
    print("found nothing")          # <<<<<<<<< prints this

解决方法

如在 docs 部分匹配嵌入/嵌套文档中所述:

整个嵌入文档的相等匹配需要指定文档的精确匹配,包括字段顺序。

因此,您必须按照存在于 DB 中的相同顺序将对象设置到 find 阶段。

我真的不知道对象的键是否遵循严格的顺序(按字母顺序或其他顺序),但使用 this 查询几乎所有内容都会输出结果。并非总是如此,我认为有一个“随机”(或无法处理)概念来存储数据 - 至少到 mongo playground -。

顺便说一句,确保结果的正确方法是使用 dot notation,因此 this 查询将始终正常工作。

coll.find({
  "size.h": 14,"size.w": 21,"size.uom": "cm"
})
,

我在想 cursor.retrieved 如果找到了什么就不是零。我猜不会。我发现这有效:

lst = list(cursor)
print(lst)

cursor.rewind()
print(list(cursor))

if len(lst) != 0:
    for d in lst:
        print(d)