使用mongoengine修改一起存储在Mongodb中的多个文档中的DictField

Modifying DictField in multiple documents together stored in Mongodb using mongoengine

我正在使用 mongo 引擎构建 mongo 数据库模型。我想通过在另一个函数

中创建的结果来修改DictField
from flask_mongoengine import MongoEngine
import marshmallow_mongoengine as ma
db = MongoEngine()

class TestData(db.Document):
    name = db.StringField(max_length=50, required=True,unique=True)
    num1 = db.IntField()
    num2 = db.IntField()
    ml_proc = db.DictField()
    hum_proc = db.DictField()

class TestDataSchema(ma.ModelSchema):
    class Meta:
        model = TestData

数据库中的示例数据如下所示

示例数据

[{
    "name" : "david",
    "num1" : 5,
    "num2" : 4,
    "ml_proc": {"sm": 7, "prod":12}
},
{
    "name" : "john",
    "num1" : 1,
    "num2" : 4
},
{
    "name" : "dune",
    "num1" : 5,
    "num2" : 5,
    "ml_proc": {"sm": 7, "prod":15}
},
{
    "name" : "jan",
    "num1" : 3,
    "num2" : 4
}]

示例数据中的 4 个文档中,第 2 个和第 4 个文档缺少字段 ml_procml_proc 中的字段是 smprod,它们是根据字段 num1num2 创建的,这些字段在定义为

的另一个函数中计算得出
import pandas as pd
    def calc(data):
        data["sm"] = data["num1"].apply(lambda x : x+2)
        data["prod"] = data["num2"].apply(lambda x : x*2)
        return data

我知道为什么需要这个功能很奇怪,但这对我的要求来说是一个非常简单的功能。我一次处理的文档数量将达到数千个。这就是为什么我使用 pandas 数据框进行处理的原因。所以我的疑问是如何使用 pandas 数据处理

生成的结果更新多个文档中的 Dictfield

感谢任何帮助,提前致谢

数据库 注意:不要对值取太多的conc。这只是一个示例图片。

也许你需要这样的东西:

db.collection.update({
   "ml_proc": {
     $exists: false
  }
 },
 [
  {
    $addFields: {
      ml_proc: {
        sm: {
          $sum: [
            "$num1",
            2
          ]
        },
        prod: {
          $sum: [
            "$num2",
            2
          ]
        }
       }
      }
    }
 ],
 {
  multi: true
})

解释:

  1. 仅匹配“ml_proc”不存在的文档
  2. addFields 根据来自同一文档的 num1 和 num2 计算的“ml_proc”
  3. 用缺失的字段“ml_proc”更新所有匹配的文档。

playground