Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Mongoengine可以更好地查询以更新列表字段中的嵌入文档_Python_Mongodb_Django Rest Framework_Mongodb Query_Mongoengine - Fatal编程技术网

Python Mongoengine可以更好地查询以更新列表字段中的嵌入文档

Python Mongoengine可以更好地查询以更新列表字段中的嵌入文档,python,mongodb,django-rest-framework,mongodb-query,mongoengine,Python,Mongodb,Django Rest Framework,Mongodb Query,Mongoengine,下面是我编写的函数,它将会话文档中某个成员的成员嵌入文档的“new_messages”标志设置为true def check_and_update_new_messages_flag(self, pk, user): conversation = Conversation.objects.with_id(pk) if conversation is None: raise ConversationNotFoundException messages = M

下面是我编写的函数,它将会话文档中某个成员的成员嵌入文档的“new_messages”标志设置为true

def check_and_update_new_messages_flag(self, pk, user):
    conversation = Conversation.objects.with_id(pk)
    if conversation is None:
        raise ConversationNotFoundException
    messages = Message.objects(conversation=pk).count()
    messages_viewed_by_user = Message.objects(conversation=pk, viewed_by=user).count()
    if messages == messages_viewed_by_user:
        for index, member in enumerate(conversation.members):
            if member.user == user:
                member = Members()
                member.user = user
                conversation.members[index] = member
                conversation.save()
        conversation.update()
我正在创建一个Members对象,并在匹配发生的索引处替换Members对象,只是将new_messages标志更新为false(在模型中设置为默认值)。是否有更好的查询来执行此任务。我不想要额外的循环和if语句,以便使这个函数更有效

编辑: 模型:

class Members(EmbeddedDocument):
    user = ReferenceField(User)
    new_messages = BooleanField(default=False)


class Conversation(Document, MboBaseDocument):
    opportunity = ReferenceField(Opportunity)
    members = ListField(EmbeddedDocumentField(Members))
    counts = EmbeddedDocumentField(Counts)
    status = StringField(required=True, default='active', regex='closed|active')
    responded_on = IntField(required=True)
    created_by = ReferenceField('User', required=True)
    updated_at = IntField()
此外,样本文件:

{
    "_id" : ObjectId("55c37053aee967157371372e"),
    "opportunity" : ObjectId("55a3907c8c5bf672f4ad31b8"),
    "members" : [ 
        {
            "user" : ObjectId("5579a6b38c5bf602374b9a0b"),
            "new_messages" : true
        }, 
        {
            "user" : ObjectId("abcdef12345abcdef1234503"),
            "new_messages" : true
        }, 
        {
            "user" : ObjectId("5581168c45910c43912e6a01"),
            "new_messages" : true
        }
    ],
    "counts" : {
        "members" : 3,
        "messages" : 6
    },
    "status" : "active",
    "responded_on" : NumberLong(1438871635000),
    "created_by" : ObjectId("abcdef12345abcdef1234503"),
    "updated_at" : NumberLong(1439194817000)
}

按照这里的逻辑走有点迷路了。你能编辑显示这里涉及的类定义吗。也不确定这里的
成员发生了什么。你说你要替换它。若然,原因为何?只是为了设置一个属性?是的。这就是问题所在。我必须将new_messages标志设置为false。我想不出mongoengine查询可以做到这一点。我已经添加了模型。在遵循这里的逻辑时有些迷失。你能编辑显示这里涉及的类定义吗。也不确定这里的
成员发生了什么。你说你要替换它。若然,原因为何?只是为了设置一个属性?是的。这就是问题所在。我必须将new_messages标志设置为false。我想不出mongoengine查询可以做到这一点。我已经添加了模型。