标签: mongoengine

OperationFailure:在MongoEngine/PyMongo中进行线程处理时出现数据库错误

我有一个函数,它将从网站读取数据,处理它,然后将其加载到MongoDB中.当我在没有线程的情况下运行它时工作正常但是一旦我设置芹菜任务只调用这个函数我经常得到以下错误:"OperationFailure:数据库错误:未经授权的db:dbname锁类型:-1"

这有点奇怪,因为如果我在多个终端上运行非芹菜版本,我根本不会得到这个错误.

我怀疑它与没有与Mongo的开放连接有关,尽管在我的代码中我在每个Mongo呼叫之前打开一个.

确切的例外情况如下:

Task twitter[a974bfcc-d6ca-4baf-b36f-cae9143ce2d9] raised exception: OperationFailure(u'database error: unauthorized db:data lock type:-1 client:68.193.49.9',)
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/celery/execute/trace.py", line 36, in trace
  return cls(states.SUCCESS, retval=fun(*args, **kwargs))
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/celery/app/task/__init__.py", line 232, in __call__
  return self.run(*args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/celery/app/__init__.py", line 172, in run
  return fun(*args, **kwargs)
File "/djangoblog/network/tasks.py", line 40, in twitter
  n_twitter.GetTweetsTwitter(user)
File "/djangoblog/network/twitter.py", line 255, in GetTweetsTwitter
  id = SaveTweet(user, network, tweet)
File "/djangoblog/network/twitter.py", line 150, in SaveTweet
  if mmo.Moment.objects(user=user.id,source_id=id,network=network.id).count() == 0:
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/mongoengine/queryset.py", line 933, …
Run Code Online (Sandbox Code Playgroud)

django mongodb celery pymongo mongoengine

5
推荐指数
1
解决办法
1105
查看次数

mongoengine ListField(ReferenceField())和自定义primary_key

我有一些非常简单的代码:

from mongoengine import *

class Comment(Document):
    id = IntField(primary_key=True)
    text = StringField()

class Message(Document):
    id = IntField(primary_key=True)
    comments = ListField(ReferenceField(Comment))

connect('test_db')

c1 = Comment(id=1)
c1.text = 'message_one'
c1.save()

c2 = Comment(id=2)
c2.text = 'message_two'
c2.save()

m = Message(id=1)
m.comments = [c1, c2]
m.save()

msg = Message.objects.get(id=1)
for comment in msg.comments:
    print comment.id, comment.text
Run Code Online (Sandbox Code Playgroud)

我期望它将打印

1个message_one

2个message_two

但是我有

1个message_one

1个message_one

当我使用任何mongodb管理界面查看数据库时,一切似乎都正常:

{“ _cls”:“消息”,“ _id”:1,“ _types”:[“消息”],

“ comments”:[{{“ $ ref”:“ comment”,“ $ id”:1},{“ $ ref”:“ comment”,“ $ id”:2}]}

我试图在代码中交换c1和c2(例如,使用m.comments = [c2,c1]),但出乎意料的是,我得到了正确的输出: …

python mongodb mongoengine

5
推荐指数
1
解决办法
4176
查看次数

你如何使用factory_boy来建模MongoEngine EmbeddedDocument?

我正在尝试使用factory_boy帮助为我的测试生成一些MongoEngine文档.我在定义EmbeddedDocumentField对象时遇到了麻烦.

这是我的MongoEngine Document:

class Comment(EmbeddedDocument):
    content = StringField()
    name = StringField(max_length=120)

class Post(Document):
    title = StringField(required=True)
    tags = ListField(StringField(), required=True)
    comments = ListField(EmbeddedDocumentField(Comment))
Run Code Online (Sandbox Code Playgroud)

这是我部分完成的factory_boy Factory:

class CommentFactory(factory.Factory):
    FACTORY_FOR = Comment
    content = "Platinum coins worth a trillion dollars are great"
    name = "John Doe"

class BlogFactory(factory.Factory):
    FACTORY_FOR = Blog
    title = "On Using MongoEngine with factory_boy"
    tags = ['python', 'mongoengine', 'factory-boy', 'django']
    comments = [factory.SubFactory(CommentFactory)] # this doesn't work
Run Code Online (Sandbox Code Playgroud)

任何想法如何指定comments字段?问题是工厂男孩试图创建CommentEmbeddedDocument.

python django mongoengine factory-boy

5
推荐指数
2
解决办法
761
查看次数

OperationError:无法保存文档(LEFT_SUBFIELD仅支持Object:ancestors.0 not:7)

我在MongoDB中有一个Organization数据库.我正在尝试使用该数据库保存数据mongoengine.我正在使用Djnago服务器.当我创建对象然后它的工作正常但在编辑后给出了一些错误.

class Organization(Document):
    username= StringField()
    ancestors = ListField(ReferenceField('Organization',dbref=False), default = list)
    parents = ListField(ReferenceField('Organization',dbref=False),default = list)
    descendants = ListField(ReferenceField('Organization',dbref=False), default = list)


obj1 = Organization(username = 'kousik')
obj1.save()
<Organization: Organization object> #obj1 created

obj2 = Organization(username = 'chowdhury',ancestors = [obj1],parents=[obj1])
obj2.save()
<Organization: Organization object> #obj2 created

obj3 = Organization(username = 'kchowdhury',ancestors = [obj1,obj2],parents=[obj2])
obj3.save()
<Organization: Organization object> #obj3 creaed

obj1.descendants = [obj2,obj3]
obj1.save()
<Organization: Organization object> #obj1 updated

obj2.descendants = [obj3]
obj2.save()

Traceback (most recent call …
Run Code Online (Sandbox Code Playgroud)

python django mongodb mongoengine

5
推荐指数
1
解决办法
703
查看次数

Mongoengine:如何按嵌入式文档字段对嵌入文档列表进行排序

所以我所追求的是:

class Comment(EmbeddedDocument):
    content = StringField()
    upvotes = IntField()
    pub_date = DateTimeField()

class Post(Document):
    title = StringField()
    comments = SortedListField(EmbeddedDocumentField(Comment))
    post_date = DateTimeField()
Run Code Online (Sandbox Code Playgroud)

默认情况下,这按照评论提交的时间顺序排序,但我想SortedListFieldupvotes嵌入的评论文档的属性进行排序.这是可能的,如果是这样,我该怎么做呢?

python mongodb mongoengine

5
推荐指数
1
解决办法
2162
查看次数

Python / Flask / MongoEngine DateTimeField

首先,我是python和flask的新手。我四处搜寻并尝试了一些无济于事的事情。我有一个具有DateTimeField作为成员之一的模型,我们称它为“ created_at”。当我返回查询集为JSON时,我在字段中看到了这一点

...
"created_at": {
    "$date": 1412938697488
} 
...
Run Code Online (Sandbox Code Playgroud)

无论如何,是否有通过自定义JSON编码器等获取输出的方式,如下所示:

"created_at": "2014-10-10T07:33:04Z",
Run Code Online (Sandbox Code Playgroud)

任何指导或建议,将不胜感激。

谢谢!

python mongoengine flask flask-mongoengine

5
推荐指数
1
解决办法
919
查看次数

在分配后,字典成为MongoEngine中的BaseList

我正在使用mongoengine 0.9.0

class EntityChange(Document):
    ...
    old_data = DictField()
    new_data = DictField()
Run Code Online (Sandbox Code Playgroud)

我想将dict对象保存到old_datanew_data.

为什么字段BaseList在转让后成为现实?

data = {u'int_id': 100500, u'_cls': 'BuildingKind', ...}
instance = EntityChange()
instance.new_data = data
# after that
# isinstance(instance, BaseList) is True
# isinstance(instance, BaseDict) is False
# instance.new_data == ['int_id', 'id', ...] is True. why?
Run Code Online (Sandbox Code Playgroud)

python dictionary mongoengine

5
推荐指数
1
解决办法
491
查看次数

mongoengine如何过滤字段不为空?

我想用category值过滤数据,但我不知道如何做到这一点mongoengine.

我尝试:

data = Data.objects.exclude(category="").order_by('-datetime')[:500]  
Run Code Online (Sandbox Code Playgroud)

但得到错误:

exclude() got an unexpected keyword argument 'category'
Run Code Online (Sandbox Code Playgroud)

我没有在文档中找到方法,你是怎么做到的?

python mongodb mongoengine mongodb-query

5
推荐指数
1
解决办法
2921
查看次数

查询MongoEngine中的嵌入式文档列表

我需要在mongoengine中查询包含所有嵌入文档的列表.这是我的架构:

class Variant(EmbeddedDocument):
    name = StringField(required=True)
    value = StringField(required=True)

class Sku(Document):
    variants = ListField(EmbeddedDocumentField(Variant))
Run Code Online (Sandbox Code Playgroud)

我可以用mongo shell做到:

db.sku.find({variants: [{'name': 'xxx', 'value': 'xxx'}]}).pretty()
Run Code Online (Sandbox Code Playgroud)

但是我还没想办法在mongoengine中做到这一点.我需要文档中的列表与我在查询中放入的列表完全相同.有任何想法吗?

python mongodb mongoengine mongodb-query

5
推荐指数
1
解决办法
6228
查看次数

将mongoengine对象转换为JSON

我试图用mongoengine和烧瓶从mongodb中获取数据.查询是完美的工作问题是当我将查询结果转换为json时,它只显示字段名称.

这是我的代码

view.py

from model import Users
result = Users.objects()
print(dumps(result))
Run Code Online (Sandbox Code Playgroud)

model.py

class Users(DynamicDocument):
    meta = {'collection' : 'users'}
    user_name = StringField()
    phone = StringField()
Run Code Online (Sandbox Code Playgroud)

产量

[["id", "user_name", "phone"], ["id", "user_name", "phone"]]
Run Code Online (Sandbox Code Playgroud)

为什么它只显示字段名称?

json mongodb mongoengine flask python-3.x

5
推荐指数
1
解决办法
5309
查看次数