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

时间:2013-08-23 11:01:20

标签: 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')}}

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

>>>User.object.query(my_query)

ValidationError: {'$ne': ObjectId('51f7f13fca798933a0c70f69')} is not a valid ObjectId

如何解决?

2 个答案:

答案 0 :(得分:5)

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

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

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

编辑这是解决方案:

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

更长的版本

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

>>>User.object.query(my_query)

首先,Document类没有object属性,它有objects。其次,objects一个QuerySet并且它没有query方法。我在mongoengine可以做的是这样的事情:

>>> res = User.objects.filter(email = 'email51@acme.com')
>>> res[0].email
u'email51@acme.com'

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

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

这是正确的说法:

User.objects.filter(email = 'email51@acme.com').filter(id__ne="51d41232ccf2f1a165a92cab")

答案 1 :(得分:3)

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

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

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

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