mongodb 有没有可能使用PyMongo来“填充”object_id引用?或者这是一个糟糕的非非SQL方法?

cvxl0en2  于 2023-03-22  发布在  Go
关注(0)|答案(1)|浏览(101)

我正在尝试在this useful guide之后创建一个简单的restful API。
然而,这可能是一个可怕的错误(而且不是一个好的非SQL方法),我希望不同的对象存储对其他对象的引用。例如,一个团队有一个ObjectID数组,一个用于球员,一个用于比赛。

class Team(BaseModelExtended):
    id: Optional[PydanticObjectId] = Field(None, alias="_id")
    name: str
    players: List[PydanticObjectId] = []
    matches: List[PydanticObjectId] = []
    date_added: Optional[datetime]

我希望能够通过填充数组中的id来查找团队中所有球员的名字。我知道Mongoose可以做到这一点,但我不确定PyMongo是否可以做到这一点。我在PyMongo文档中找不到populate方法。此外,我开始意识到这可能是一个糟糕的方法?
任何建议都将不胜感激。

4szc88ey

4szc88ey1#

pymongo没有populate函数。您必须使用$lookupstage(在populate()文档中为referenced)创建聚合管道
MongoDB在版本〉= 3.2中有类似join的$lookup聚合操作符。
所以,做一些事情,比如:

team_collection.aggregate(
  [
    {"$match": {"_id": team_oid}},
    {"$lookup": 
      {
        "from": "player",
        "localField": "players", # Works with an array
        "foreignField": "_id",
        "as": "playerd_data"
      }
    }
  ])

注意,您可以将$lookup与数组一起使用。
至于你的另一个问题,那是你自己的选择。但是如果你只有像这些这样的高度结构化的数据,NoSQL解决方案可能不是最好的。

相关问题