Mongoengine:如何更新现有文档的特定字段?

时间:2018-07-10 06:25:46

标签: flask mongoengine marshmallow

我有一个现有的mongo文档,该文档已通过REST API公开。 API请求将包含文档中的某些字段,这些字段需要使用新值进行更新,或者如果该字段为null,则在其中插入新值。如何对现有mongoengine文档的字段执行更新?我正在使用棉花糖-mongoengine在烧瓶上进行序列化。

我面临的问题是,如果请求有效负载中缺少某个字段,则在调用update时将其余字段设置为kwargs会导致将缺少的字段设置为None。如何仅更新或插入有效负载中给定的字段?

2 个答案:

答案 0 :(得分:1)

约瑟夫的回答还可以。但是另一个答案不会伤害到她!

这是我使用flask-mongoengine更新文档的方式

实际代码:

Game.objects(id = _id).update(
        set__kickoff = request_json.get('kickoff'),
        set__gameid = request_json.get('gameid'),
        set__home_team = request_json.get('home_team'),
        set__away_team = request_json.get('away_team'),
        set__home_win = request_json.get('home_win'),
        set__draw = request_json.get('draw'),
        set__away_win = request_json.get('away_win'),
        set__sport = request_json.get('sport')
        )

Game class : 

    import datetime
    flask_mongoengine import BaseQuerySet, MongoEngine
    db = MongoEngine()

    class Game(db.Document):
    kickoff  = db.DateTimeField(required=True)
    added_on  = db.DateTimeField(default=datetime.datetime.utcnow)
    gameid = db.FloatField(required=True)     
    home_team = db.StringField(required=True)
    home_win = db.FloatField(required=True)    
    draw = db.FloatField(required=True)
    away_win = db.FloatField(required=True)
    away_team = db.StringField(required=True)
    sport = db.StringField(required=True) 
    meta = {
        'collection':'games',
        'queryset_class': BaseQuerySet
    }

PS:请记住在python中缩进代码

我还注意到您在问题中标记了棉花糖。在这里,是从他们的官方git repo中提取的示例 here

  

首先,我们需要一个Mongoengine文档:

import mongoengine as me

class Task(me.EmbeddedDocument):
    content = me.StringField(required=True)
    priority = me.IntField(default=1)


class User(me.Document):
    name = me.StringField()
    password = me.StringField(required=True)
    email = me.StringField()
    tasks = me.ListField(me.EmbeddedDocumentField(Task))
  

太好了!现在是棉花糖模式的时候了。为了使事情保持干燥,我们使用marshmallow-mongoengine进行映射:

import marshmallow_mongoengine as ma

class UserSchema(ma.ModelSchema):
    class Meta:
        model = User
  

最后是时候使用我们的模式加载/转储文档了:首先让我们创建一个文档

user_schema = UserSchema()
u, errors = user_schema.load({"name": "John Doe", "email": 
      "jdoe@example.com", "password": "123456","tasks": [{"content": "Find a 
      proper password"}]})
u.save()
  

如果该文档已经存在,我们可以使用update对其进行更新

u
u2, errors = user_schema.update(u, {"name": "Jacques Faite"})
>>> u2.name
"Jacques Faite"

答案 1 :(得分:0)

如果只想更新一个文档,则可以使用save方法。我就是做这个的。如果文档已经存在,它将更新字段而不是创建新文档。

window.appData = val;

fun3() {
   var val = window.appData
...

如果您想更新许多文档,建议您查阅用户指南的atomic updates部分。

有点像〜

car = Car.objects(pk=car_id) # return a queryset
if car:     
    car = car.get(pk=car_id) # return an object from queryset
    car.make = requestData['make']
    car.model = requestData['model']
    car.mileage = requestData['mileage']
    car.save()

“设置”后跟两个下划线是一个修饰符。我在上面链接的指南中还有更多修饰符。