在mongoengine中选择文档但不包括一个

Ale*_*.P. 0 python mongodb mongoengine

我有从DB和wat中检索的文档以选择任何其他排除此文档.我试过以下查询:

{'email': u'test@mail.com', 'id': {'$ne': ObjectId('51f7f13fca798933a0c70f69')}}
{'email': u'test@mail.com', 'pk': {'$ne': ObjectId('51f7f13fca798933a0c70f69')}}

{'email': u'test@mail.com', '_id': {'$ne': ObjectId('51f7f13fca798933a0c70f69')}}
Run Code Online (Sandbox Code Playgroud)

最后一个是MongoDB控制台的有效查询,前两个 - 我试图传递给我的查询对象的查询失败并显示错误消息:

>>>User.object.query(my_query)

ValidationError: {'$ne': ObjectId('51f7f13fca798933a0c70f69')} is not a valid ObjectId
Run Code Online (Sandbox Code Playgroud)

怎么解决?

Ros*_*oss 6

MongoEngine 有自己的查询语法,与 pymongo 不同。

示例可以在文档中看到:http : //docs.mongoengine.org/en/latest/guide/querying.html

正如@bpgergo 提到的,您需要将查询转换为正确的语法,例如:

User.objects.filter(id__ne="51f7f13fca798933a0c70f69", email = 'test@mail.com')
Run Code Online (Sandbox Code Playgroud)


bpg*_*rgo 5

我认为前两个查询无效的原因是不存在的字段:'id','pk'.注意id之前的下划线:_id.

在我的控制台中,这是一个有效的查询:

db.user.find( { 'email' : 'test@mail.com', '_id' : { '$ne' : ObjectId("51d41232ccf2f1a165a92ca6")} } )
Run Code Online (Sandbox Code Playgroud)

编辑这是解决方案:

User.objects.filter(email = 'test@mail.com').filter(id__ne="51f7f13fca798933a0c70f69")

更长的版本

我用mongoengine python模块0.8.4进行了测试,所以我尝试运行这行代码:

>>>User.object.query(my_query)
Run Code Online (Sandbox Code Playgroud)

首先,Document类没有object属性,它有objects.其次,objects一个查询集并没有query方法.我在mongoengine可以做的是这样的:

>>> res = User.objects.filter(email = 'email51@acme.com')
>>> res[0].email
u'email51@acme.com'
Run Code Online (Sandbox Code Playgroud)

到现在为止!此查询将返回相同的错误:

User.objects.filter(email = 'email51@acme.com').filter(id__ne="ObjectId('51d41232ccf2f1a165a92cab')")
mongoengine.errors.ValidationError: ObjectId('51d41232ccf2f1a165a92cab') is not a valid ObjectId
Run Code Online (Sandbox Code Playgroud)

这是正确的方式:

User.objects.filter(email = 'email51@acme.com').filter(id__ne="51d41232ccf2f1a165a92cab")
Run Code Online (Sandbox Code Playgroud)