mongoengine有类似的方法来填充吗
db.collection.posts.findById(id).populate('user_id')
ybzsozfc1#
一天过去了,但我仍然没有看到任何东西,有一个API文档有关.populate()在mongoengine,我选择了自己的方式。mongoengine是一个Object-Oriented驱动程序,与mongoose相比,已经有预定义的函数.populate(),但如果你知道OOP是如何工作的,它对你来说只是小菜一碟,这里有一个简单的技巧
.populate()
mongoengine
mongoose
# .schema.author.py class Author(Document): name = StringField(required=True) # .schema.book.py class Book(Document): title = StringField() author = ReferenceField(Author) def tojson(self): json = { 'title ': self.title , 'author ': self.author, } json['author'] = self.author.name return json # .route.book.py def get(self): try: books = [] for book in Book.objects: books.push(book.tojson()) return {'status': True, 'response': books} except Exception as e: print(e)
对于每个Book对象,预期结果必须填充Author
Book
Author
{ "status": true, "response": [ { "title": "<book-name>", "author": { "name": "<author-name>" } } ] }
r8xiu3jd2#
我也在找populate。现在是2023年了,但是看看我的代码在将来是否对你有帮助。
async def retrieve_courses(): courses = Course.objects.all() populated_courses = [] for course in courses: subject_ids = [str(subject.id) for subject in course.subjects] subjects = Subject.objects.filter(id__in=subject_ids) subject_dicts = [subject.to_dict() for subject in subjects] course_dict = course.to_dict() course_dict["subjects"] = subject_dicts populated_courses.append(course_dict) return convert_objectId_to_str(populated_courses)
LazyReferenceField是一个延迟引用,在访问被引用对象之前,它不会执行实际的数据库查询。这在处理大型集合或不总是需要获取被引用对象的情况下很有用。另一方面,ReferenceField在设置引用时立即执行数据库查询,从而允许直接访问被引用的对象,而无需额外的查询。可以使用get()或filter()来获取详细的引用对象。输出结果和我最喜欢的 Mongoose 一模一样。
4sup72z83#
我不是MongoEngine的Maven,但你可以这样查询:post = Posts.objects(id=id).first()它从该模型返回数据,并且它已经填充。您可以通过以下方式访问文章的作者:post.author.name
post = Posts.objects(id=id).first()
post.author.name
3条答案
按热度按时间ybzsozfc1#
一天过去了,但我仍然没有看到任何东西,有一个API文档有关
.populate()
在mongoengine
,我选择了自己的方式。mongoengine
是一个Object-Oriented驱动程序,与mongoose
相比,已经有预定义的函数.populate()
,但如果你知道OOP是如何工作的,它对你来说只是小菜一碟,这里有一个简单的技巧对于每个
Book
对象,预期结果必须填充Author
r8xiu3jd2#
我也在找populate。现在是2023年了,但是看看我的代码在将来是否对你有帮助。
LazyReferenceField是一个延迟引用,在访问被引用对象之前,它不会执行实际的数据库查询。这在处理大型集合或不总是需要获取被引用对象的情况下很有用。
另一方面,ReferenceField在设置引用时立即执行数据库查询,从而允许直接访问被引用的对象,而无需额外的查询。
可以使用get()或filter()来获取详细的引用对象。输出结果和我最喜欢的 Mongoose 一模一样。
4sup72z83#
我不是MongoEngine的Maven,但你可以这样查询:
post = Posts.objects(id=id).first()
它从该模型返回数据,并且它已经填充。您可以通过以下方式访问文章的作者:
post.author.name