MongoAlchemy查询嵌入式文档
问题描述:
我想知道如何使用MongoAlchemy关于嵌入式文档操作。 但我没有找到任何有关这些文件。 任何人都可以给我一些帮助吗?MongoAlchemy查询嵌入式文档
下面是演示代码:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from flask import Flask
from flaskext.mongoalchemy import MongoAlchemy
app = Flask(__name__)
app.config['DEBUG'] = True
app.config['MONGOALCHEMY_DATABASE'] = 'book'
db = MongoAlchemy(app)
class Comment(db.Document):
user_id = db.StringField(db_field='uid')
posted = db.StringField(db_field='posted')
class Book(db.Document):
title = db.StringField()
author = db.StringField()
comments = db.ListField(db.DocumentField(Comment), db_field='Comments')
from mongoalchemy.session import Session
def test():
with Session.connect('book') as s:
s.clear_collection(Book)
save()
test_Book()
def save():
title = "Hello World"
author = 'me'
comment_a = Comment(user_id='user_a', posted='post_a')
comment_b = Comment(user_id='user_b', posted='post_b')
comments = [comment_a, comment_b]
book = Book(title=title, author=author, comments=comments)
book.save()
def test_Book():
book = Book.query.filter({'author':'me'}).first()
comment = book.comments[0]
comment.posted = str(book.comments[0].posted)+'_new'
book.save()
print 'change posted: Book.comments[0].posted:', book.comments[0].posted
comment_c = Comment(user_id='user_c', posted='post_c')
book.comments.append(comment_c)
book.save()
print 'append: Book.comments[2].posted:', book.comments[2].posted
query = Book.query.filter({Book.comments:{'$elemMatch':{Comment.user_id:'user_c'}}}).limit(1).first()
print 'query type:', type(query)
if __name__ == '__main__':
test()
-
我想查询数据,user_id是“user_c”,只是回退一个评论,我怎么能这样做? 下面的这些方法是否是MongoAlchemy remommended?顺便说一句,这些方法将返回整个文档。
#query = Book.query.filter({Book.comments:{'uid':'user_c'}}).limit(1).first() #query = Book.query_class(Comment).filter(Comment.user_id == 'user_c').limit(1).first() #query = Book.query.filter({'comments':{'$elemMatch':{'uid':'user_c'}}}).limit(1).first() #query = Book.query.filter({Book.comments:{'$elemMatch':{Comment.user_id:'user_c'}}}).limit(1).first()
如何将“user_c”更改为“user_c_new”,通过查询找到?
- 如何删除一个user_id为“user_b”的评论?
答
Mongo不支持返回的子文档。您可以使用$ elemMatch进行过滤,以便只返回具有匹配属性的文档,但您必须自己获取注释。
query = Book.query.filter({Book.comments:{'$elemMatch':{Comment.user_id:'user_c'}}})
query = query.fields(Book.comments.elem_match({Comment.user_id:'user_c'}))
result = query.limit(1).first()
print 'query result:', result.comments
注意,有一个与此一个错误,直到0.14.3(我刚刚发布几分钟前),这将造成results.comments:您可以通过仅如下返回意见栏略微优化不工作。
另一个非常重要的笔记是我在那里做的elem_match只返回第一个匹配元素。如果你想要所有匹配的元素,你必须自己过滤它们:
query = Book.query.filter({Book.comments:{'$elemMatch':{Comment.user_id:'user_c'}}})
result = query.limit(1).first()
print 'query result:', [c for c in result.comments if c.user_id == 'user_c']
谢谢!谢谢你的帮忙! – user2089487