赵走x博客
网站访问量:151480
首页
书籍
软件
工具
古诗词
搜索
登录
2、在MongoDB开启验证的情况下,新建一个数据库 dbName
mac 安装mongodb
mongodb同一个document中两个字段比较查询
mongoengine 关系处理
mongoengine查询
ubuntu安装mongodb(不使用docker)
Centos安装mongodb(不使用docker)
MongoDB唯一索引(Unique) 空值问题
1、mongoengine.errors.InvalidQueryError: Cannot perform join in mongoDB
1、sanic中对motor的操作封装
1、mongodb设置密码后无效,还是可以外网无密码访问
mongoengine查询
资源编号:76259
mongodb相关问题
数据库
热度:87
查询
# 1、基本查询 ``` uk_users = User.objects(country='uk') # 通过使用双下划线代替对象属性访问语法中的点,也可以使用字段查找语法来引用嵌入式文档上的字段: uk_pages = Page.objects(author__country='uk') ``` >如果您的字段名称类似于mongodb运算符名称(例如type,lte,lt ...),并且您想将其放在查找关键字的末尾,mongoengine会自动在$之前加上$。为避免这种情况,请在查询关键字末尾使用__。例如,如果您的字段名称是type并且您想通过该字段进行查询,则必须使用.objects(user__type__="admin")而不是 .objects(user__type="admin") # 2、查询运算符 ``` young_users = Users.objects(age__lte=18) ``` 可用的运算符如下: * ne - 不等于 * lt - 少于 * lte –小于或等于 * gt - 比...更棒 * gte –大于或等于 * not–取消标准检查,可以在其他操作员之前使用(例如 )Q(age__not__mod=(5, 0)) * in –值在列表中(应提供值列表) * nin –值不在列表中(应提供值列表) * mod – value % x == y, where x and y are two provided values * all –提供的值列表中的每个项目都在数组中 * size –数组的大小为 * exists –存在字段值 # 3、字符串查询 以下运算符可用作使用正则表达式进行查询的快捷方式: * exact –字符串字段与值完全匹配 * iexact –字符串字段与值完全匹配(不区分大小写) * contains –字符串字段包含值 * icontains –字符串字段包含值(不区分大小写) * startswith –字符串字段以值开头 * istartswith –字符串字段以值开头(不区分大小写) * endswith –字符串字段以值结尾 * iendswith –字符串字段以值结尾(不区分大小写) * match –执行$ elemMatch,以便您可以匹配数组中的整个文档 # 4、列表查询 ``` class Page(Document): tags = ListField(StringField()) # This will match all pages that have the word 'coding' as an item in the # 'tags' list Page.objects(tags='coding') # 第一个位置胃db的查询 Page.objects(tags__0='db') #获取列表的一部分: comments - skip 5, limit 10 Page.objects.fields(slice__comments=[5, 10]) # 对于更新文档,如果您不知道列表中的位置,则可以使用$位置运算符 Post.objects(comments__by="joe").update(**{'inc__comments__$__votes': 1}) # 但是,这与语法没有很好的对应关系,因此您也可以使用大写字母S Post.objects(comments__by="joe").update(inc__comments__S__votes=1) ``` # 5、原始查询 可以提供原始PyMongo查询作为查询参数,将其直接集成到查询中。使用__raw__ 关键字参数完成此操作: ``` Page.objects(__raw__={'tags': 'coding'}) ``` # 6、排序 ``` # Order by ascending date blogs = BlogPost.objects().order_by('date') # equivalent to .order_by('+date') # Order by ascending date first, then descending title blogs = BlogPost.objects().order_by('+date', '-title') ``` # 7、Limiting and skipping results # 8、默认文档查询 默认情况下,objects文档上的objects 属性返回一个QuerySet不过滤集合的属性-它返回所有对象。这可以通过在文档上定义修改查询集的方法来更改。该方法应接受两个参数– doc_cls和queryset。第一个参数是在Document其上定义方法的 类(在这种意义上,该方法比常规方法更像classmethod() ),第二个参数是初始查询集。该方法需要修饰以queryset_manager()使其被识别。 ``` class BlogPost(Document): title = StringField() date = DateTimeField() @queryset_manager def objects(doc_cls, queryset): # This may actually also be done by defining a default ordering for # the document, but this illustrates the use of manager methods return queryset.order_by('-date') ``` 您无需调用方法objects-您可以根据需要定义任意数量的自定义管理器方法: ``` class BlogPost(Document): title = StringField() published = BooleanField() @queryset_manager def live_posts(doc_cls, queryset): return queryset.filter(published=True) BlogPost(title='test1', published=False).save() BlogPost(title='test2', published=True).save() assert len(BlogPost.objects) == 2 assert len(BlogPost.live_posts()) == 1 ``` # 9、自定义查询集 如果您想添加用于与文档进行交互或过滤文档的自定义方法,则扩展QuerySet类可能是解决方法。要QuerySet在文档上使用自queryset_class定义类,请在Document的meta字典中将其设置为自定义类 : ``` class AwesomerQuerySet(QuerySet): def get_awesome(self): return self.filter(awesome=True) class Page(Document): meta = {'queryset_class': AwesomerQuerySet} # To call: Page.objects.get_awesome() ``` # 10、聚合 Aggregation ``` # 虽然.count()跟len(列表对象)计算结果一样,但是count()函数性能优于len() num_users = User.objects.count() # sum() 求和 yearly_expense = Employee.objects.sum('salary') # average() 求平均值 mean_age = User.objects.average('age') ``` ``` # 频率 class Article(Document): tag = ListField(StringField()) # After adding some tagged articles... tag_freqs = Article.objects.item_frequencies('tag', normalize=True) from operator import itemgetter top_tags = sorted(tag_freqs.items(), key=itemgetter(1), reverse=True)[:10] ``` # 11、MongoDB aggregation API ``` class Person(Document): name = StringField() Person(name='John').save() Person(name='Bob').save() pipeline = [ {"$sort" : {"name" : -1}}, {"$project": {"_id": 0, "name": {"$toUpper": "$name"}}} ] data = Person.objects().aggregate(pipeline) assert data == [{'name': 'BOB'}, {'name': 'JOHN'}] ``` # 12、查询效率和性能 ### 只返回指定数据only,如果要排除字段,exclude()则与相反 only()。 ``` >>> class Film(Document): ... title = StringField() ... year = IntField() ... rating = IntField(default=3) ... >>> Film(title='The Shawshank Redemption', year=1994, rating=5).save() >>> f = Film.objects.only('title').first() >>> f.title 'The Shawshank Redemption' >>> f.year # None >>> f.rating # default value 3 ``` ### 关闭引用 ``` post = Post.objects.no_dereference().first() assert(isinstance(post.author, DBRef)) with no_dereference(Post) as Post: post = Post.objects.first() assert(isinstance(post.author, DBRef)) # Outside the context manager dereferencing occurs. assert(isinstance(post.author, User)) ``` # 13、高级查询 ``` from mongoengine.queryset.visitor import Q # Get published posts Post.objects(Q(published=True) | Q(publish_date__lte=datetime.now())) # Get top posts Post.objects((Q(featured=True) & Q(hits__gte=1000)) | Q(hits__gte=5000)) ``` # 14、原子更新 更新方法有:update(), update_one(), modify() 更新修饰符有: * set –设置一个特定的值 * unset –删除特定值(自MongoDB v1.3起) * inc –将值增加给定数量 * dec –将值递减给定量 * push –将值附加到列表 * push_all –将几个值附加到列表中 * pop– 根据值删除列表的第一个或最后一个元素 * pull –从列表中删除值 * pull_all –从列表中删除多个值 * add_to_set –仅在列表中没有值时才添加值 原子更新的语法与查询语法相似,但是修饰符位于字段之前,而不是字段之后: ``` >>> post = BlogPost(title='Test', page_views=0, tags=['database']) >>> post.save() >>> BlogPost.objects(id=post.id).update_one(inc__page_views=1) >>> post.reload() # the document has been changed, so we need to reload it >>> post.page_views 1 >>> BlogPost.objects(id=post.id).update_one(set__title='Example Post') >>> post.reload() >>> post.title 'Example Post' >>> BlogPost.objects(id=post.id).update_one(push__tags='nosql') >>> post.reload() >>> post.tags ['database', 'nosql'] ``` 如果未指定修饰符运算符,则默认值为$set。因此以下句子是相同的: ``` >>> BlogPost.objects(id=post.id).update(title='Example Post') >>> BlogPost.objects(id=post.id).update(set__title='Example Post') ```