【问题标题】:Get Data from another collection (string -> ObjectId)从另一个集合中获取数据(字符串 -> ObjectId)
【发布时间】:2021-11-15 17:47:39
【问题描述】:

假设我有这两个集合:

// Members:
{
    "_id":{
        "$oid":"60dca71f0394f430c8ca296d"
    },
    "church":"60dbb265a75a610d90b45c6b",
    "name":"Julio Verne Cerqueira"
},
{
    "_id":{
        "$oid":"60dca71f0394f430c8ca29a8"
    },
    "nome":"Ryan Steel Oliveira",
    "church":"60dbb265a75a610d90b45c6c"
}

// Churches
{
    "_id": {
        "$oid": "60dbb265a75a610d90b45c6c"
    },
    "name": "Saint Antoine Hill",
    "active": true
},
{
    "_id": {
        "$oid": "60dbb265a75a610d90b45c6b"
    },
    "name": "Jackeline Hill",
    "active": true
}

我想查询它并得到这样的结果:

// Member with Church names
{
    "_id":{
        "$oid":"60dca71f0394f430c8ca296d"
    },
    "church":"Jackeline Hill",
    "name":"Julio Verne Cerqueira"
},
{
    "_id":{
        "$oid":"60dca71f0394f430c8ca29a8"
    },
    "church":"Saint Antoine Hill",
    "nome":"Ryan Steel Oliveira"
}

如果我尝试查找,我会得到以下结果:(它正在获取整个教堂集合)。

我将如何进行查询,所以它只给我与该成员相关的一个教会?

如果可能的话,如何按教堂的字母顺序然后按名称对结果进行排序?

Obs.: MongoDB 版本:4.4.10

【问题讨论】:

  • 仅供参考,我删除了angularangular-material 标签,因为问题与它们无关,更多的是mongodb 问题。

标签: mongodb aggregation-framework mongodb-realm


【解决方案1】:

$lookup 中存在匹配错误 --> $pipeline --> $match

应该是:

$match: {
  $expr: {
    $eq: [
      "$_id",
      "$$searchId"
    ]
  }
}

根据提供的文档,memberschurchies 的关系将是一对多。因此,当您通过$lookup 加入memberschurchies 时,输出church 将是一个只有一个churchies 文档的数组。


聚合管道:

  1. $lookup - 加入members 集合($$searchId)和churchies_id)。
  2. $unwind - 将 church 数组字段解构为多个文档。
  3. $project - 装饰输出文档。
  4. $sort - 按churchname 升序排序。
db.members.aggregate([
  {
    "$lookup": {
      "from": "churchies",
      "let": {
        searchId: {
          "$toObjectId": "$church"
        }
      },
      "pipeline": [
        {
          $match: {
            $expr: {
              $eq: [
                "$_id",
                "$$searchId"
              ]
            }
          }
        },
        {
          $project: {
            name: 1
          }
        }
      ],
      "as": "church"
    }
  },
  {
    "$unwind": "$church"
  },
  {
    $project: {
      _id: 1,
      church: "$church.name",
      name: 1
    }
  },
  {
    "$sort": {
      "church": 1,
      "name": 1
    }
  }
])

Sample Mongo Playground

【讨论】:

  • 太棒了!正是我需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 2021-05-24
相关资源
最近更新 更多