我有一个ListField(DictField)包含像 -
{'user_id': '12345', 'timestamp' : 'datetime-object'}
Run Code Online (Sandbox Code Playgroud)
在mongoengine中,如何从user_id上查询的List中删除元素.例如,我想删除具有特定user_id的条目.我试过以下 -
update_one(pull__notes__user_id = '12345')
Run Code Online (Sandbox Code Playgroud)
这notes是集合的名称.
此语句返回1但不会从List中删除该元素.我怎样才能做到这一点?
我正在使用Flask和MongoEngine开发一个博客引擎,我的帖子需要顺序ID.
我需要MongoEngine为每个新帖子创建一个新的ID,所以我想做这样的事情:
class Post(Document):
title = StringField(required=True)
content = StringField(required=True)
published_at = datetime.utcnow()
id = Post.objects.count() + 1
Run Code Online (Sandbox Code Playgroud)
这会有用吗?有一个更好的方法吗?
例如..在Mongodb ..
> db.test.findOne({}, {'mapField.FREE':1})
{
"_id" : ObjectId("4fb7b248c450190a2000006a"),
"mapField" : {
"BOXFLUX" : {
"a" : "f",
}
}
}
Run Code Online (Sandbox Code Playgroud)
'mapField'字段由Mongoengine的MapField组成.'mapField'字段有一个键和数据的日志..但我只检索'BOXFLUX'..
这个查询在MongoEngine中不起作用....例如..
BoxfluxDocument.objects( ~~ querying ~~ ).only('mapField.BOXFLUX')
Run Code Online (Sandbox Code Playgroud)
你可以看到.. 只有('mapField.BOXFLUX') 或只有('mapField__BOXFLUX')不起作用.它检索所有'mapField'数据,包括'BOXFLUX'一个..
如何只检索MapField的字段???
我在这里关注这个例子:
http://docs.mongodb.org/manual/tutorial/write-a-tumblelog-application-with-flask-mongoengine/
我的问题在于:
from flask import Flask
from flask.ext.mongoengine import MongoEngine
app = Flask(__name__)
app.config["MONGODB_DB"] = "my_tumble_log"
app.config["SECRET_KEY"] = "KeepThisS3cr3t"
db = MongoEngine(app)
if __name__ == '__main__':
app.run()
Run Code Online (Sandbox Code Playgroud)
这假设MONGODB_DB在我的本地计算机和默认端口上是"my_tumble_log".如果我的mongo数据库位于具有不同端口的远程计算机上,该怎么办?如何修改示例以允许此操作?
我尝试在MONGODB_DB app.config之前添加一行:
app.config['MONGODB_CONNSTRING'] = "mongodb://myremotehost:myport"
Run Code Online (Sandbox Code Playgroud)
虽然它没有任何影响.
需要你的帮助.我尝试使用mongoengine,烧瓶,烧瓶登录.
我的模特:
class Post(db.Document):
text = db.StringField(max_length=240)
pub_date = db.DateTimeField(default=datetime.datetime.now)
author = db.ReferenceField(Member)
Run Code Online (Sandbox Code Playgroud)
我得到当前用户(flask-login):
from flask.ext.login import current_user
Run Code Online (Sandbox Code Playgroud)
比在views.py中:
new_post = Post()
new_post.text = 'bla-bla'
#new_post.author = current_user #- DON`T WORK
new_post.author = Member.objects.get(id=current_user.id) #-WORK (WHY?)
new_post.save()
Run Code Online (Sandbox Code Playgroud)
有什么错new_post.author = current_user,如果new_post.author = Member.objects.get(id=current_user.id)-工作正常.
如果尝试new_post.author = current_user- 获取错误:
mongoengine.errors.ValidationError
ValidationError: ValidationError (Post:None) (A ReferenceField only accepts DBRef or documents: ['author'])
Run Code Online (Sandbox Code Playgroud)
谢谢,人.
我正在尝试使用MongoEngine进行一个项目而且相当不错.我想知道是否可以为另一个字段中的字段设置默认值?像这样的东西
import mongoengine as me
class Company(me.Document):
short_name = me.StringField(required=True)
full_name = me.StringField(required=True, default=short_name)
Run Code Online (Sandbox Code Playgroud)
这失败了,错误 ValidationError (Company:None) (StringField only accepts string values: ['full_name'])
:编辑:
我没有提到我的应用程序有一个服务层,使我能够像这样简单地执行:
if company_data['short_name'] is None:
myCompany.full_name = company_data['short_name']
obj = myCompany.save()
Run Code Online (Sandbox Code Playgroud)
而且效果很好.
我知道get_or_create现在已经弃用了赞成使用upsert,但是如何update_one返回对象而不是修改对象的数量,如果我不想更新任何东西,我可以只检索一个对象吗?
例如
Model.objects.get_or_create(first_name='John', last_name='Potter', age=40)
# assuming that first_name + last_name + age are enough to uniquiely indentify a person
Run Code Online (Sandbox Code Playgroud)
返回一个Model对象(如果它不存在则为新对象,如果存在,则返回现有对象).使用新方法相当于什么?
Model.objects(first_name='John', last_name='Potter', age=40).update_one(upsert=True)
# returns number of objects (1)
Model.objects(first_name='John', last_name='Potter', age=40).update_one(set__first_name='John', set__last_name='Potter', set__age=40,upsert=True)
# returns number of objects (1)
Run Code Online (Sandbox Code Playgroud)
有没有办法让它返回对象,并使其行为完全像get_or_create?
我在文档中找不到如何做到这一点
嗨,我正在使用带有mongoengine的烧瓶,这是我的模特
class Change(db.Document):
code = (('CAD', 'Dolar Canadiense'),
('GBP', 'Libra Esterlina'),
('MXN', 'Peso Mexicano'),
('CHF', 'Franco Suiso'),
('EUR', 'Euro'),
('DKK', 'Corona Danesa'),
('SEK', 'Corona Sueka'),
('JPY', 'Yen Japones'),
('CUP', 'Peso Cubano'),
('PAB', 'Balboa Panama'),
('AUD', 'Dolar Australiano'),
('USD', 'Dolar Estadounidense'),
('NOK', 'Corona Noruega'))
fecha = db.DateTimeField(required = True, unique_with = 'moneda')
moneda = db.StringField(max_length=3, choices=code, required = True)
recanje = db.FloatField(required = True)
canje = db.FloatField(required = True)
@db.queryset_manager
def objects(doc_cls, queryset):
return queryset.order_by('date')
Run Code Online (Sandbox Code Playgroud)
当我进行查询时,如何获得de选择的值:
moneda = Exchange.objects.distinct("moneda")
Run Code Online (Sandbox Code Playgroud)
返回:
['Dolar …Run Code Online (Sandbox Code Playgroud) 我在使用list和regex查询查询mongodb模型(Python/MongoEngine)时遇到异常.代码是
from mongoengine import *
import re
db = connect('testdb')
class Team(Document):
name = StringField()
groups = ListField(ReferenceField('Group'))
class Group(Document):
name = StringField()
Team.drop_collection()
Group.drop_collection()
g1 = Group('G1')
g1.save()
g2 = Group('G2')
g2.save()
g3 = Group('G3')
g3.save()
g4 = Group('G4')
g4.save()
t = Team('Team1',[g1,g2,g3])
t.save()
t = Team('Team2',[g1,g2,g4])
t.save()
t = Team('Team3',[])
t.save()
t = Team('Team3',[g3,g2])
t.save()
t = Team('Team3',[g4,g1])
t.save()
# TypeError: cannot deepcopy this pattern object
teams = Team.objects( Q(groups__in=[g3,g2]) & Q(name=re.compile('eam3')))
for team in teams:
print team.name …Run Code Online (Sandbox Code Playgroud) EmbeddedDocument将允许将文档存储在另一个文档中,同时RefereneField只存储它的引用.但是,他们实现了类似的目标.他们有特定的用例吗?
PS:已经有一个关于SO 的问题,但没有好的答案.
mongoengine ×10
python ×8
mongodb ×4
flask ×3
django ×2
deep-copy ×1
flask-login ×1
pymongo ×1
regex ×1