在"pymongo (Python 3.7)"和"mongoDB"中使用$cond创建具有分生孢子的新键值的问题



我有一个具有以下文档格式的集合:

{ 
{ "_id": 1234,
"processes": [
"0": { "0_0": aaaa , "0_1": bbbb },
"1": { "1_0": cccc, "1_1": dddd },
"2": { "2_0": eeee, "2_1": ffff},
]},
{ "_id": 5678,
"processes": [
"0": { "0_0": gggg, "0_1": hhhh},
"1": { "1_0": iiii, "1_1": jjjj},
"2": { "2_0": kkkk, "2_1": mmmm},
]}
}

在我对同一个DB提出的另一个问题中,我的同事@hhharsha36帮助我解决了我遇到的问题:

使用MongoDB集合中文档列表字段内的子文档中的Pymongo布尔字段进行更新

正因为如此,我当前的聚合查询如下所示:

cursor_processes = collection.aggregate([
{
"$unwind": "$processes"
},
{
"$replaceRoot": {
"newRoot": {
"$mergeObjects": [
{
"_id": "$_id"
},
"$processes"
]
}
}
}
])

此时此刻,我想创建一个键值,该键值取决于以前是否存在一个名为motive的键值。然后:

cursor_processes = collection.aggregate([
{
"$unwind": "$processes"
},
{
"$replaceRoot": {
"newRoot": {
"$mergeObjects": [
{
"_id": "$_id"
},
"$processes",
{
"code": {
'$cond': [
{"processes.0": {'$exists':  True}},
{'$concat': ["$processes.0_0", "$processes.0_1", {'$substr': ["$_id", 0, -1]}, "si_00"]}
{'$concat': ["$processes.1_0", "$processes.2_0", {'$substr': ["$_id", 0, -1]}, "no_00"]}
]
}
}
]
}
}
}
])
list_proc = [i for i in cursor_processes] #Create a list

当我调试时,我得到以下错误消息:

pymongo.errors.OperationFailure:无法识别的表达式"$exists",完整错误:{"ok":0.0,"errmsg":"无法识别的表达"$existing","code":168,"codeName":"InvalidPipelineOperator"}

$exists是一个查询运算符。

$cond期望第一个参数是布尔表达式,而不是筛选器文档。

您可以尝试$ifNull管道运算符,或者$eq和$not管道运算符的组合

最新更新