2013-11-28 256 views
0

我想知道如何使用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() 
  1. 我想查询数据,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() 
    
  2. 如何将“user_c”更改为“user_c_new”,通过查询找到?

  3. 如何删除一个user_id为“user_b”的评论?

回答

1

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'] 
+0

谢谢!谢谢你的帮忙! – user2089487