Pymongo操作没有返回任何结果



我有这样的代码:

def add_new_category(group_id: str, name: str) -> tuple:
"""
Used to add a new transaction category
:param group_id: str
:param name: str
:return: tuple of bool and result
"""
try:
current_app.logger.info("add_new_category function called ...")            
if len(list(db.groups_categories.find())) == 0:
data = {
"group_id": group_id,
"categories": [{
"cat_id": ObjectId(),
"name": name,
"created_at": now
}]
}
result = db.groups_categories.insert_one(data).inserted_id
_d = db.groups_categories.find().sort('group_id', pymongo.ASCENDING).limit(1)                

else:                
result = db.groups_categories.update_one({"group_id": ObjectId(group_id)}, {"$push": {"categories": {
"cat_id": ObjectId(),
"name": name,
"created_at": now
}}})
_d = db.groups_categories.find().sort('group_id', pymongo.ASCENDING).limit(1)                

except Exception as e:
current_app.logger.error(f"add_new_category error: {e}")
函数最初应该添加记录和后续操作应该附加一个对象类别数组。第一部分工作,但第二部分没有错误,但没有添加对象。

我已经在这个超过24小时,我似乎找不到为什么第二次操作(update_one)不工作。任何提示都很有帮助。

请注意,我是在本地主机的atlas实例上添加这些数据,并使用mongodb的pymongo库。

update_one操作日志:

In second else ...
[2022-06-15 09:11:49 +0100] [48333] [INFO] db_init Function called ...
M: []
[2022-06-15 09:11:51 +0100] [48333] [INFO] db_init Function called ...
[2022-06-15 09:11:54 +0100] [48333] [INFO] db_init Function called ...
REMADD:127.0.0.1 - USER:- RDATE:[15/Jun/2022:09:11:57 +0100] METHOD:POST URL:/api/v1.0/transactions/categories PROTO:HTTP/1.1 STATUS:200 UAGENT:PostmanRuntime/7.26.8 PID:<48333>

总体工作流程:

检查集合是否为空,如果为空

  1. 插入一条记录并返回,否则
  2. 添加一个新的对象记录到类别数组

结果(s):

插入操作有效,但push操作无效。没有显示错误,但类别数组没有按预期更新。

假设连续呼叫中的group_id是相同的,您需要始终使用它。

将其作为普通字符串插入:

data = {"group_id": group_id,....}
db.groups_categories.insert_one(data)

并通过从update字符串生成的objectId进行筛选:

db.groups_categories.update_one({"group_id": ObjectId(group_id)},..

Mongo比较类型,字符串永远不等于对象。没有匹配过滤器参数的文档,所以update影响0个文档。

在两个查询中使用字符串或对象id

我对OP的所有评论仍然有效。代码中存在许多缺陷,因此单独修复此问题将导致在特定条件下出现意想不到的结果。

最新更新