我从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
如何解决?
答案 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')