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

Why doesn't this pymongo subdocument find work?

我正在考虑使用 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"}, "status": "A"},
    {"item": "paper", "qty": 100, "size": {"h": 8.5, "w": 11, "uom": "in"}, "status": "D"},
    {"item": "planner", "qty": 75, "size": {"h": 22.85, "w": 30, "uom": "cm"}, "status": "D"},
    {"item": "postcard", "qty": 45, "size": {"h": 10, "w": 15.25, "uom": "cm"}, "status": "A"}
])

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

如在 docs 中解释到 部分匹配 Embedded/Nested 文档:

Equality matches on the whole embedded document require an exact match of the specified document, including the field order.

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

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

顺便说一句,确保结果的正确方法是使用 dot notation so 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)