mongodb 在Mongoengine中填充,引用字段

mctunoxg  于 2023-06-29  发布在  Go
关注(0)|答案(3)|浏览(159)

mongoengine有类似的方法来填充吗

db.collection.posts.findById(id).populate('user_id')
ybzsozfc

ybzsozfc1#

一天过去了,但我仍然没有看到任何东西,有一个API文档有关.populate()mongoengine,我选择了自己的方式。
mongoengine是一个Object-Oriented驱动程序,与mongoose相比,已经有预定义的函数.populate(),但如果你知道OOP是如何工作的,它对你来说只是小菜一碟,这里有一个简单的技巧

# .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

{
  "status": true,
  "response": [
     {
         "title": "<book-name>",
         "author": {
            "name": "<author-name>"
         }
     }
  ]
}
r8xiu3jd

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 一模一样。

4sup72z8

4sup72z83#

我不是MongoEngine的Maven,但你可以这样查询:
post = Posts.objects(id=id).first()
它从该模型返回数据,并且它已经填充。您可以通过以下方式访问文章的作者:
post.author.name

相关问题