标签: mongoengine

Mongoengine unique_with

我正在使用MongoDB的mongoengine.我必须创建一个文档,其中元组(merchant_id,order_id,event_type)必须是唯一键.

直到现在,我始终把独特性局限于两个领域.以下工作 -

merchant_id = StringField(required = True)
order_id = StringField(required = True, unique_with = 'merchant_id')
Run Code Online (Sandbox Code Playgroud)

现在,我正在尝试为三个领域做到这一点 -

merchant_id = StringField(required = True)
order_id =  StringField(required = True)
event_type = StringField(
    required = True,
    unique_with = ['merchant_id', 'order_id'])
Run Code Online (Sandbox Code Playgroud)

但这不起作用.我没有在模块中收到错误.但如果我输入数据 -

merchant_id = 'Merchant1'
order_id = 'Order1'
event_type = 'Event1'
Run Code Online (Sandbox Code Playgroud)

然后尝试用相同的添加另一个数据merchant_idorder_id而不同event_id,那么它提供了有关被重复键错误.

我也尝试过:

merchant_id = StringField(required = True)
order_id =  StringField(required = True)
event_type = StringField(
    required = True,
    unique_with = ('merchant_id', 'order_id'))
Run Code Online (Sandbox Code Playgroud)

python mongodb mongoengine

6
推荐指数
2
解决办法
4187
查看次数

Mongoengine地理空间搜索

有人用mongengine进行地理空间搜索吗?我似乎无法让它工作!GeoPointField中必须包含的数据格式是什么?

我该如何格式化?我在文档中找不到任何有关格式化的内容!

geolocation geospatial mongodb pymongo mongoengine

6
推荐指数
1
解决办法
3387
查看次数

如何使用python查询mongodb中的不同结果?

我有一个包含多个文档的mongo集合,假设如下(假设Tom因为某种原因在2012年有两位历史教师)

{
"name" : "Tom"
"year" : 2012
"class" : "History"
"Teacher" : "Forester"
}

{
"name" : "Tom"
"year" : 2011
"class" : "Math"
"Teacher" : "Sumpra"
}


{
"name" : "Tom",
"year" : 2012,
"class" : "History",
"Teacher" : "Reiser"
}
Run Code Online (Sandbox Code Playgroud)

我希望能够查询"Tom"曾经拥有的所有不同的类,即使Tom有多个"历史"类和多个教师,我只是希望查询获得Tom所在的最小数量的文档所有这些,并且"历史"显示一次,而不是具有包含重复"历史"的多个文档的查询结果.

我看了看:http: //mongoengine-odm.readthedocs.org/en/latest/guide/querying.html

并希望能够尝试类似的东西:

student_users = Students.objects(name = "Tom", class = "some way to say distinct?")
Run Code Online (Sandbox Code Playgroud)

虽然它似乎没有记录.如果这不是语法上正确的方法,这可能在mongoengine中,或者有一些方法可以用像pymongo这样的其他库来实现吗?或者我是否必须使用Tom查询所有文档然后进行一些后处理才能获得唯一值?无论如何,语法都会受到赞赏.

python mongodb mongoengine

6
推荐指数
1
解决办法
1万
查看次数

mongoengine查询投影

我想在mongoengine原始查询中进行投影,这是我的查询,但是不起作用

query  =  {'$or':[{'col1':{'$regex':srch_text}},{'col2':{'$regex':srch_text}},{'col3':{'$regex':srch_text}}]}

projection = {'col4':0}
test= Test.objects(__raw__=(query,projection))
Run Code Online (Sandbox Code Playgroud)

ps:没有投影就可以了

test= Test.objects(__raw__=(query))
Run Code Online (Sandbox Code Playgroud)

mongodb pymongo mongoengine

6
推荐指数
1
解决办法
2472
查看次数

Django Rest框架字典字段

我使用Mongodb和mongoengine作为Django API的后端.我用来创建api的框架是Django Rest Framework.

我需要在Mongo中的字段中存储字典,并且在调用方法post时我所做的最好的是使用charfield并在函数restore_object中解析字典.

有更好的方法来实现这一目标吗?

创建一个字典字段会更好吗?我不知道这有多难.

谢谢.

编辑显示一些代码,注意我将字典存储为字典(DictField),它的内容可以从一个对象更改为其他对象.

我的mongoengine模型是这样的:

class MyDoc(mongoengine.Document):
    name = mongoengine.StringField(max_length=200)
    context = mongoengine.DictField()
Run Code Online (Sandbox Code Playgroud)

和我的序列化器类似:

class MyDocSerializer(serializers.Serializer):

 name = serializers.CharField(max_length=200)
 context = serializers.CharField()
 url = serializers.HyperlinkedIdentityField(
 view_name="drf:mydoc-detail",)

 def __init__(self,*args,**kwargs):
  super(MyDocSerializer,self).__init__(*args,**kwargs)


 def restore_object(self, attrs, instance=None):

    #Parse string to dict
    #this is so ugly, notice I had to repace ' for " to
    #avoid an error parsing the json
    context = JSONParser().parse(
    StringIO.StringIO(
        attrs['context'].replace("'","\"")
      )
    )

    attrs['context'] = context
    if instance is not None:
      instance.name = attrs['name']
      instance.context …
Run Code Online (Sandbox Code Playgroud)

django mongodb mongoengine django-rest-framework

6
推荐指数
1
解决办法
3995
查看次数

如何从json Mongoengine DynamicDocument更新

我试图找到一种优雅的方式来更新现有的MongoDB文档,其中从网页收到的数据为json.问题是我事先不知道哪些字段会被更新 - 所以我不能使用set__field,我只有一个json表示要在我的MongoDB文档中更新的字段.另外我使用的是DynamicDocuments,因此可能会在文档上设置新字段.例如:

class Study(DynamicDocument):
    study_accession_nr = StringField()
    study_name = StringField()
    study_type = StringField()
Run Code Online (Sandbox Code Playgroud)

而json可能看起来像 - 例如:

{"_id" : "123", "study_name" : "Statistics"}
Run Code Online (Sandbox Code Playgroud)

要么

{"_id" : "123", "study_type" : "research", "study_name" : "Statistical analysis"} 
Run Code Online (Sandbox Code Playgroud)

我可以从控制台轻松地做到,或者使用pymongo,但我不知道如何使用Mongoengine,除非我手动设置(myDocInstance,nameOfField,val),这对我来说看起来不那么优雅.谢谢!

python mongoengine

6
推荐指数
1
解决办法
2390
查看次数

使用Mongoengine添加和更新ListField

使用Mongoengine并尝试形成标签云.对于每个项目,我想附加一个或多个标签.这里使用类似标签的东西(在每个问题下面).

在这里搜索和阅读了很多帖子后,我仍然无法正确地将新条目添加到ListField,或者如何替换它们.

class Item(Document):
    tags = ListField(StringField(max_length=300))
Run Code Online (Sandbox Code Playgroud)

我正在尝试通过使用表单推送一个或多个新标签并收集发布的结果.在我的views.py中,我有以下检查:

if 'tags' in request.POST and request.POST['tags'] <> '':
   for Tag in request.POST.getlist('tags'):
       ItemData.update(push__tags__S__tags=Tag)
Run Code Online (Sandbox Code Playgroud)

尝试推送时,它失败了:

ValidationError(配置文件:5185505b73ea128e878f4e82)(列表字段中只能使用列表和元组:['tags'])

显然我使用的是错误的类型,但我迷失了如何解决这个问题.奇怪的是,由于某种原因,数据被附加到记录中..(发布"测试"和刷新浏览器)

"tags":["test","test"]}

可以向我展示一个小例子如何处理发布的字符串(来自HTML表单)并将其正确地推送到ListField(以及如何将它们全部替换).

谢谢!

listfield mongoengine

6
推荐指数
1
解决办法
1万
查看次数

MongoEngine:在将document_type定义为str时,ReferenceField只接受DBRef或文档

在一个MongoEngine模型中,当我使用时,我正在使用参考字段

schedule =  ReferenceField('Schedule',required=True)
Run Code Online (Sandbox Code Playgroud)

并尝试插入文档

#my_schedule being a 'Schedule' object that has been created and saved successfully
record.schedule = my_schedule
record.save()
Run Code Online (Sandbox Code Playgroud)

我明白了

ValidationError: ValidationError (Calling:None) (A ReferenceField only accepts DBRef or documents: ['schedule'])
Run Code Online (Sandbox Code Playgroud)

但是,如果我将字段定义更改为

schedule =  ReferenceField(path.to.Schedule,required=True)
Run Code Online (Sandbox Code Playgroud)

(IE直接引用Schedule模型)

该文档可以成功保存.我怎样才能避免这个错误?

对计划模型的完全捍卫

class Schedule(Document):

    uid =       StringField(required=True)

    start =     DateTimeField(required=True)
    end =       DateTimeField(required=True)

    days =      ListField(required=True)

    toc =       StringField(required=False)

    meta = {
        'indexes':['uid']
    }
Run Code Online (Sandbox Code Playgroud)

并呼吁

class Calling(Document):
    """
    Calling Point
    """

    schedule =  ReferenceField('Schedule',required=True)

    tiploc =    StringField(required=True)
    calling =   ListField(StringField(required=True))

    arrive = …
Run Code Online (Sandbox Code Playgroud)

python mongodb mongoengine

6
推荐指数
1
解决办法
3273
查看次数

如何使用Mongoengine删除嵌入式文档?

我有一个具有EmbeddedDocumentField的集合.我无法找到如何从集合中删除嵌入文档的示例.有人能为我提供一个例子或参考吗?

以下是我的设置:

  • Python 2.7.5
  • Django 1.5.5
  • MongoEngine 0.8.7

码:

class Merchant(Document):
    merchant_id = StringField(max_length=50)
    merchant_name = StringField(max_length=150)
    merchant_name_search_alias = StringField(max_length=150)
    website = StringField(max_length=150)
    location = ListField(EmbeddedDocumentField(Location))
    address = StringField(max_length=50)
    city = StringField(max_length=30)
    state = StringField(max_length=20)
    zipcode = IntField()
    phone_nummber = StringField(max_length=10)
    sub_lat = FloatField()
    sub_lng = FloatField()
    country = StringField(max_length=20)
    promotion = ListField(EmbeddedDocumentField(Promotion))


class Promotion(EmbeddedDocument):
    provider_name = StringField(max_length=50)
    provider_website = URLField()
    promo_name = StringField(max_length=300)
    promo_name_search_alias = StringField(max_length=100)
    retail_price = DecimalField(precision=2, force_string=True)
    discount_price = DecimalField(precision=2, force_string=True)
    deal_url = URLField()
    buy_url = …
Run Code Online (Sandbox Code Playgroud)

python django mongoengine

6
推荐指数
1
解决办法
3706
查看次数

MongoMock和mongoengine不清除数据库

在单元测试期间,我打电话给:

self.connection = connect(db="testdb", host="mongomock://localhost")
self.connection.drop_database("testdb")
Run Code Online (Sandbox Code Playgroud)

在两次测试之间,但是数据仍然存在。是否有已知的解决方法?

python mongodb mongoengine mongomock

6
推荐指数
0
解决办法
362
查看次数