MongoAlchemy的嵌套文档查询问题

尼再采 发布于 2013/11/28 21:05
阅读 606
收藏 1

项目中使用的MongoDB开发包是MongoAlchemy,但是在使用的过程中,发现文档不是很齐全,有些相关的内容没有介绍。特别是嵌套文档这一块,我也不知道具体应该怎么操作?也没找到相关demo。不知各路英豪是否有人使用过?使用过的人麻烦给点儿帮助,谢谢。 下面我贴一个demo:

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:{'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()
    query = Book.query.filter({Book.comments:{'$elemMatch':{Comment.user_id:'user_c'}}}).limit(1).first()
    print 'query type:', type(query)

if __name__ == '__main__':
    test()




1.怎么查询user_id等于"uer_c"的情况,而且只返回一个一个Comment,怎么写呢?

2.怎么通过查询的方式来找到user_id等于user_c,并且把user_c改为user_c_new的操作? 

3. 怎么删除一个Comment,比如删除一个user_id等于user_b的comment

加载中
0
尼再采

问题有结果了,SO上发了帖子,MA(MongoAlchemy)的作者jeff回答了该问题。

http://stackoverflow.com/questions/20265271/mongoalchemy-query-embedded-documents

大概的意思呢就是mongo不支持查询只返回子文档,但是我们的解决方法就是先拿整个的文档,然后自己处理拿出你要的子文档。

经过这个问题,比较了一下MA和ME(MongoEngine)两个项目,感觉MA不是太靠谱,首先用的人比较少,问题也可能比较多,这次就帮助jeff发现了一个bug,然后更新了一下版本。其次,更新代码的速度比较慢,MA除了这次这个bug以外,上次更新是6个月以前,而ME的最近更新是2个月,3个月,7个月以前,更新频率比较快,还是比较活跃的,而且用的人比较多。因此,决定换ME试试。


返回顶部
顶部