我正在努力学习mongoengine语法.

我有以下型号...

class Post(EmbeddedDocument):
    uid = StringField(required=True)
    text = StringField(required=True)
    when = DateTimeField(required=True)


class Feed(Document):
    label = StringField(required=True)
    feed_url = StringField(required=True)
    posts = ListField(EmbeddedDocumentField(Post))

    def my_method(self, post):
        pass

... 通过将post对象传递到我的_方法,我想更新一个现有的post,如果它存在于self中.使用匹配的uid发布,或推送至self.如果没有,就发帖子.

在mongoengine中,有没有语法可以在一次调用中实现这一点?

推荐答案

否对于列表字段,不能在单个查询中向上插入列表.$addToSet不起作用,因为你改变了post,所以你无法匹配.你可以对此进行编码,但它确实会创造一种竞争条件,在这种情况下,出现错误的机会很小,例如:

    class Post(EmbeddedDocument):
        uid = StringField(required=True)
        text = StringField(required=True)

    class Feed(Document):
        label = StringField(required=True)
        feed_url = StringField(required=True)
        posts = ListField(EmbeddedDocumentField(Post))

    Feed.drop_collection()

    Feed(
        label="label",
        feed_url="www.feed.com"
    ).save()

    post = Post(uid='1', text="hi")
    updated = Feed.objects(posts__uid=post.uid).update_one(set__posts__S=post)
    if not updated:
        Feed.objects.update_one(push__posts=post)

首先,我们try 更新,如果它不存在,我们就推到列表上——这是另一个进程运行的机会窗口,可能会推到列表上的post个.

这种风险可能是可以接受的,但实际上,我认为改变你的模式更好,可能会把Post个分成自己的集合.然后可以使用update语句设置整个对象.成本将是获取提要数据的额外查询.

Mongodb相关问答推荐

如何用Python和MongoDB找到单据字段的最大值?

MongoDB - 将属性添加到数组中的对象(如果不存在)

Mongoose 查询以获取内部数组和该内部数组中的特定元素

数组过滤器 MongoDB

随着时间的推移在 mongodb 中获得

mongoDB文档数组字段中的唯一项如何

MongoDB乘以对象值?

Mongoexport 在日期范围内使用 $gt 和 $lt 约束

mongoose如何在幕后工作

Select 匹配mongodb中两个字段的concat值的记录

如何在 MongoDB 集合中查找与给定条件匹配的文档和单个子文档

无法将 $match 运算符用于带有 ObjectId 的 mongodb/mongoose 聚合

如何使用 Node.js 和 mongoose 解决command find requires authentication?

MongoDB:单个数据库处理程序的 >5 个打开连接

从每个组中 Select 前 N 行

了解 Mongoose 中的关系和外键

如何判断 MongoDB 中是否存在字段?

处理Mongodb连接的正确方法是什么?

是否可以使用聚合框架对 MongoDB 中的 2 个字段求和?

在mongoose中创建和查找地理位置