为什么 MongoEngine 中的 exclude() 不排除所有字段?

Why exclude() in MongoEngine does not exclude all fields?

作为MongoEngine says in documentation:

only(*fields) Load only a subset of this document’s fields.

post = BlogPost.objects(...).only('title', 'author.name')

现在我 运行 我自己的用户集合如下:

user = User.objects(__raw__=condition).only('status').get()

但是当我打印输出 (print user.to_json()) 时,它给出如下结果:

{"_id": {"$oid": "59ba3c7428999b08223dc4aa"}, "cover": "", "avatar": "", "dob": {"$date": 1505347200000}, "created_at": {"$date": 1505384574064}, "updated_at": {"$date": 1505384574064}, "bio": "", "location": "", "account_type": "regular", "status": "inactive", "phone": ""}

我想我没有遗漏任何东西。

现在我使用exclude将一些字段列入黑名单:

user = User.objects(__raw__=condition).exclude('status').exclude('username').exclude('bio').exclude('email').get()

输出为:

{"_id": {"$oid": "59ba3c7428999b08223dc4aa"}, "fullname": "Mu Fullname", "password": "$pbkdf2-sha256366$y9lbq/Ueo5QSohSi1FrLmQ$YOLu.KzmLiDhS6BVh4cTPg7xFpYLZ/2l478jnROj0ok", "cover": "", "avatar": "", "dob": {"$date": 1505347200000}, "created_at": {"$date": 1505377384359}, "updated_at": {"$date": 1505377384359}, "bio": "", "location": "", "verification": {"email": false, "celebrity": false, "phone": false}, "account_type": "regular", "status": "inactive", "phone": ""}

usernameemail 被排除,但不包括 statusbio.

我的用户模型是:

class Verification(EmbeddedDocument):
    email = BooleanField(default=False, allow_blank=True, allow_null=True)
    celebrity = BooleanField(default=False, allow_blank=True, allow_null=True)
    phone = BooleanField(default=False, allow_blank=True, allow_null=True)


class User(Document):
    email = EmailField(required=True, max_length=200, unique=True)
    # regex '^\w+$' equals [a-zA-Z_]
    username = StringField(regex='^\w+$', required=True, max_length=15, min_length=3, unique=True)
    fullname = StringField(required=True, max_length=20)
    password = StringField(required=True)
    cover = StringField(default='')
    avatar = StringField(default='')
    dob = DateTimeField(default='')
    created_at = DateTimeField(default=datetime.datetime.utcnow())
    updated_at = DateTimeField(default=datetime.datetime.utcnow())
    bio = StringField(default='')
    location = StringField(default='')
    verification = EmbeddedDocumentField(Verification, required=True)
    account_type = StringField(required=True, default='regular', choices=('page', 'regular'))
    status = StringField(required=True, default='inactive', choices=('inactive', 'active', 'block'))
    phone = StringField(regex='^$|^[0-9()\-\.\s]+$', default='')

似乎 exclude returns 文档字段的默认值,以防它们被排除:

exclude()only() 只影响通过线路发送的数据。

字段将只显示它们的默认值,因为属性没有被剥离并且 没有延迟加载。

实际上,这是 github 上的一个问题。参见 https://github.com/MongoEngine/mongoengine/issues/305