例如..
class Page(Document)
tags = ListField(StringField())
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们可以像这样在标签列表中找到一个值.
Page.objects(tags='coding')
Run Code Online (Sandbox Code Playgroud)
如果标签像['coding','x','y']那么文件将匹配......
但我的问题是如何找到不在列表字段中的值.
我的错误代码将是..
Page.objects(tags!='coding')
Run Code Online (Sandbox Code Playgroud)
要么
Page.objects(tags__not = 'coding')
Run Code Online (Sandbox Code Playgroud)
要么
Page.objects(tags__not__in = 'coding')
Run Code Online (Sandbox Code Playgroud)
但是......他们不仅仅是工作..
如何查询ListField中没有给定值的文档?
我必须遗漏一些非常明显的东西.但我似乎找不到使用mongoengine来表示集合的方法.
class Item(Document):
name = StringField(required=True)
description = StringField(max_length=50)
parents = ListField(ReferenceField('self'))
i = Item.objects.get_or_create(name='test item')[0]
i2 = Item(name='parents1')
i2.save()
i3 = Item(name='parents3')
i3.save()
i.parents.append(i2)
i.parents.append(i2)
i.parents.append(i3)
i.save()
Run Code Online (Sandbox Code Playgroud)
上面的代码将在i1的parents字段中为i2创建一个重复的条目.你怎么表达像mongoengine这样的关键外键?
不太确定这是否真的很简单,但我真的找不到任何关于这个主题的内容.但是,使用常规MongoEngine库,甚至使用Flask-MongoEngine作为基于Flask的网站,是否可以将MongoEngine文档作为直接JSON返回?
谢谢!
我想将一个新的ListField EmbeddedDocument附加到现有的ListField EmbeddedDocument文档中.换句话说,将新文档附加到属于列表中的文档的列表中.
我的模型:帖子可以包含多个评论,每个评论可以有几个赞:
class Post(Document):
txt = StringField()
comments = ListField(EmbeddedDocumentField(Comment))
class Comment(EmbeddedDocument):
comment = StringField()
comment_id = ObjectIdField()
likes = ListField(EmbeddedDocumentField(Like))
class Like(EmbeddedDocument):
user = ReferenceField(User)
date = DateTimeField(default=datetime.utcnow,required=True)
Run Code Online (Sandbox Code Playgroud)
我的代码:(它没有工作'append'命令不存在,只有'set'存在)
def appendNewLike():
user = {..}
target = ObjectId(commentId)
newLike = Like(user=user)
Product.objects(comments__comment_id=target).update(append_comments__S__likes=newLike)
Run Code Online (Sandbox Code Playgroud)
理想的解决方案是:
def appendNewLike():
user = {..}
target = ObjectId(commentId)
newLike = Like(user=user)
Product.objects(comments__comment_id=target).comments.likes.append(newLike)
Run Code Online (Sandbox Code Playgroud)
评论?建议?
我想知道如何让mongoengine和djangoREST框架相互合作.目前,我的模型是
from mongoengine import *
import datetime
class Blog(Document):
post_id = IntField(unique=True)
title = StringField(max_length=144, required=True)
date_created = DateTimeField(default=datetime.datetime.now)
body = StringField(required=True)
Run Code Online (Sandbox Code Playgroud)
我将序列化程序定义为
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import *
class BlogList(APIView):
"""
Lists all blog posts, or creates a new post
"""
def get(self, request, format=None):
posts = Blog.objects.to_json()
return Response(posts)
Run Code Online (Sandbox Code Playgroud)
但是我收到了错误
TypeError at /blog/
__init__() takes exactly 1 argument (2 given)
Request Method: GET
Request URL: http://127.0.0.1:8000/blog/
Django Version: 1.5.1
Exception Type: TypeError …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用from_json方法构建一个文档对象.object.save()不会抛出任何错误,但文档未插入mongo.
另一方面,如果我通过为每个字段赋值来创建对象,它可以正常工作.
我无法找到原因.以下是两种情况的代码.
from flask import Flask
from flask.ext.mongoengine import MongoEngine
import json, datetime
app = Flask(__name__)
app.config["MONGODB_SETTINGS"] = {'DB': 'test','host': 'localhost'}
app.config["SECRET_KEY"] = "mySecretKey"
db = MongoEngine(app)
class User(db.Document):
user_id = db.StringField(max_length=16, primary_key = True)
username = db.StringField(min_length=8)
email = db.EmailField(required = True, unique = True)
password = db.StringField(required = True)
date_of_birth = db.DateTimeField()
gender = db.StringField(choices = ('M', 'F'))
'''
This one works. This will add a user in local mongodb(test)
'''
u1 = User()
u1.username = 'test12345' …Run Code Online (Sandbox Code Playgroud) 我想用我的mongoengine db处理我的Django项目中的身份验证.
我尝试了一些关于这些问题的例子,这些问题在旧问题中得到了回答,我正在使用Django 1.6和mongoengine.一切都已安装,运行,我可以创建文档并将其保存到Mongoengine DB.
我正在关注http://mongoengine-odm.readthedocs.org/en/latest/django.html
我收到以下错误:
当我跑:
>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
Run Code Online (Sandbox Code Playgroud)
我明白了:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/REBORN/reb_env/local/lib/python2.7/site-packages/django/db/models/manager.py", line 273, in __get__
self.model._meta.object_name, self.model._meta.swapped
AttributeError: Manager isn't available; User has been swapped for 'mongo_auth.MongoUser'
>>>
Run Code Online (Sandbox Code Playgroud)
我真的不明白两件事:
- 我是否必须创建和定义用户将被存储的数据库,或者它们将自动创建?
- 什么是经理?我没有定义任何经理的东西
在开始时我认为寄存器保存在数据库中.称为'mongo_auth.MongoUser',但它并没有将它保存在任何地方.
这是模型:
# Create your models here.
from mongoengine import *
class Profile(Document):
email = StringField(required=True)
first_name = StringField(max_length=50)
last_name = StringField(max_length=50)
class auth_user(Document): …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来获取我的 json 模式并在运行时动态创建一个 mongoengine 类。
例如:下面写的 mongoengine 类
class user(Document):
_id = StringField(required=False) # mongodb id
name = StringField(required=True) # user name
email= StringField(required=False,regex="^[a-zA-Z0-9]*@mydomain.com$") # user email
Run Code Online (Sandbox Code Playgroud)
将与从该模式生成的运行时动态生成的类相同
{
"type":"object",
"properties":{
"_id" : {"type":"string"},
"name" : {"type":"string"},
"email" : {"pattern":"^[a-zA-Z0-9]*@mydomain.com$"}
}
}
Run Code Online (Sandbox Code Playgroud)
有什么建议?
根据Mongoengine API指南(http://mongoengine-odm.readthedocs.org/en/latest/apireference.html):
class mongoengine.queryset.QuerySet(document, collection)
Run Code Online (Sandbox Code Playgroud)
是" 从查询返回的一组结果.包装MongoDB游标,提供Document对象作为结果. "
当我type()在我的解释器中检查QuerySet对象时,它表示QuerySet对象是a <class 'mongoengine.queryset.QuerySet'>,与API指南一致.
我很困惑,但因为以实际访问个人Mongoengine Document在查询集实例对象,我必须使用索引的方法,如[0](对于第一Document物体)或[2](用于第三Document对象)参见本SO问题关于切片QuerySet.有趣的是,您还可以调用len()QuerySet实例.
即使QuerySet是一个类对象,为什么它看起来像一个列表对象?据我所知,它不会继承UserList,也没有data属性.任何帮助将不胜感激.
谢谢.
编辑:
谢谢你的建议@isbadawi.这很有帮助.QuerySet类对象确实包含__getitem__方法,正如您的链接所暗示的那样,该方法与索引"大致相同"(例如x.__getitem__(i),大致相当于x[i]).因此,如果QuerySet正在模拟列表类__getitem__,那么实际的Document对象存储在类中的哪个位置?在一个属性?这是dir(QuerySet)我的翻译中的输出:
> ['_QuerySet__already_indexed', '_QuerySet__dereference', '__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__iter__', '__len__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_as_pymongo', '_as_pymongo_coerce', '_build_index_spec', '_class_check', '_collection', '_collection_obj', '_cursor', '_cursor_args', …Run Code Online (Sandbox Code Playgroud) 我正在努力优化(主要)由MongoDB支持的Django应用程序.它在负载测试下死亡.在当前有问题的页面上,New Relic显示了700多个来电pymongo.collection:Collection.find.大部分代码都是由初级编码员编写的,通常我会寻找添加标记,进行更智能连接和删除循环以减少查询调用的地方,但这里不能选择连接.我做了什么(在添加基于EXPLAINs的指标之后)尝试通过进行一般查询然后在循环中过滤那个较小的集合来降低循环中的成本.虽然我已经从900个查询中得到了这个数字,但即使在页面上进行了大量的工作,700仍然看起来很疯狂.我想甚至可能find在过滤现有的查询集时被调用,但代码表明它始终是数据库查询.
我已经添加了一些日志记录到mongoengine来查看查询来自哪里以及查看EXPLAIN语句,但是我没有大量的运气来筛选信息.mongoengine本身似乎是性能问题的一部分:我转而使用mongomallard作为测试,并在页面上获得了50%的性能提升.不幸的是,我得到了很多其他的页面上的错误(尽我可以告诉它过滤现有查询集时,会出现野鸭做得不好;错误抱怨的电话deepcopy这是发生在一台发电机,你不能做 - 我在那里打了一堵砖墙.虽然Mallard对我们来说似乎不是一个可行的替代品,但它确实表明在mongoengine中将很多时间用于将对象转换为Python和从Python转换对象.
我该怎么做才能进一步减少通话?或者我是否专注于错误的事情,应该在其他地方攻击问题?
编辑:提供一些代码/模型
相关页面显示课程的教学大纲,显示课程中的所有模块,课程和课程中的概念.对于每个概念,还显示了用户在概念中的进展.所以有很多循环来使层次结构变得清晰(并且它不是根据Mongo文档建议的任何模式存储的).
class CourseVersion(Document):
...
course_instances = ListField(ReferenceField('CourseInstance'))
courseware_containers = ListField(EmbeddedDocumentField('CoursewareContainer'))
class CoursewareContainer(EmbeddedDocument):
id = UUIDField(required=True, binary=False, default=uuid.uuid4)
....
courseware_containers = ListField(EmbeddedDocumentField('self'))
teaching_element_instances = ListField(StringField())
Run Code Online (Sandbox Code Playgroud)
课程的模块,课程和概念存储在courseware_containers; 我们需要获取所有概念,以便我们可以获取id列表teaching_element_instances以找到用户已经处理过的最新的概念(如果有的话),然后查找他们的进度.
*为了清楚起见,我正在使用一个分析器并查看时间和行为方式正确的方式我知道,不仅仅是改变事物,希望最好.