我正在使用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_id和order_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) 有人用mongengine进行地理空间搜索吗?我似乎无法让它工作!GeoPointField中必须包含的数据格式是什么?
我该如何格式化?我在文档中找不到任何有关格式化的内容!
我有一个包含多个文档的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查询所有文档然后进行一些后处理才能获得唯一值?无论如何,语法都会受到赞赏.
我想在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和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) 我试图找到一种优雅的方式来更新现有的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),这对我来说看起来不那么优雅.谢谢!
使用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(以及如何将它们全部替换).
谢谢!
在一个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) 我有一个具有EmbeddedDocumentField的集合.我无法找到如何从集合中删除嵌入文档的示例.有人能为我提供一个例子或参考吗?
以下是我的设置:
码:
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) 在单元测试期间,我打电话给:
self.connection = connect(db="testdb", host="mongomock://localhost")
self.connection.drop_database("testdb")
Run Code Online (Sandbox Code Playgroud)
在两次测试之间,但是数据仍然存在。是否有已知的解决方法?
mongoengine ×10
mongodb ×7
python ×6
django ×2
pymongo ×2
geolocation ×1
geospatial ×1
listfield ×1
mongomock ×1