mongodb / mongoose -将来自一个集合的结果与来自另一个集合的结果连接起来,其中它们的ID匹配

pexxcrt2  于 2023-03-30  发布在  Go
关注(0)|答案(1)|浏览(99)

我是mongo的新手,对$lookup、aggregate、populate等选项有点困惑,我想确保我使用的是最好的数据结构。
我目前有两个模式--一个用于保存的URL,另一个用于应该与这些URL相关联的Stats。
URL架构:

const UrlSchema = new mongoose.Schema({
  urlId: {
    type: String,
    required: true,
  },
...

统计模式:

const StatSchema = new mongoose.Schema({
  urlRef: { //each urlRef corresponds to a `urlId` inside the UrlSchema
    type: String,
    required: true,
  },
...

我试图通过循环并添加stats来返回所有url的结果及其在nodejs中对应的stats,但我可以告诉这不是合适的方法:

//get the urls
const urls = await Url.find({ userId: userId })

//add the stats to each url
for (const url of urls) {
  const urlStats = await Stat.find({ urlRef: url.urlId });
  url.stats = urlStats || [];
}

//send the urls with their stats back to the client
res.json(urls);

正确的方法是什么呢?每个URL的统计信息的数量可能会变得非常大,所以我不想直接将它们作为一个数组存储在每个URL中。

mpbci0fu

mpbci0fu1#

您可以将聚合框架与$lookup stage结合使用,根据匹配的ID连接两个集合。
下面是查询:

db.urls.aggregate([
  {
    $match: {
      userId: "123"
    },
    
  },
  {
    $lookup: {
      from: "stats",
      localField: "urlId",
      foreignField: "urlRef",
      as: "stats"
    }
  }
])

这里有一个链接到MongoDB playground,你可以在这里看到你的查询工作:https://mongoplayground.net/p/WWQGgqbxLFH

相关问题