MongoDB 根据字段名获取字段值

MongoDB get fieldvalue based on fieldname

我是 MongoDB 的新手,我不确定我正在尝试做的事情是否可行。我已经用尽了我的 Google 技能,所以我希望这里有人能给我一个正确方向的推动。

我的数据结构如下:

db={
  "people": [
    {
      "id": 1,
      "name": "Pete",
      "occupation": "baker"
    },
    {
      "id": 2,
      "name": "Mike",
      "occupation": "painter"
    }
  ],
  "activity": [
    {
      "baker": "bakes",
      "painter": "paints"
    }
  ]
}

虽然这只是示例数据,但我的“activity”是一个包含唯一键的大型文档,我试图根据键名(当它与来自“人”文件)。

我想要实现的是这个输出:

[
  {
    "id": 1,
    "name": "Pete",
    "occupation": "baker”,
    “activity:” “bakes”
  },
  {
    "id": 2,
    "name": "Mike",
    "occupation": "painter”,
    “activity”: “paints”
  }
]

这可能吗?

如果我理解你的数据库和数据模型,它似乎是一个糟糕的模型。 如果数据模型不同(见下文),查询将非常简单。鉴于此,这是您可以使用模型生成所需输出的一种方法。

db.people.aggregate([
  { "$lookup": {
      "from": "activity",
      "let": { occ: "$occupation" },
      "pipeline": [
        {
          "$replaceWith": {
            "$arrayToObject": {
              "$filter": {
                "input": { "$objectToArray": "$$ROOT" },
                "as": "kv",
                "cond": { "$eq": [ "$$kv.k", "$$occ" ] }
              }
            }
          }
        }
      ],
      "as": "activity"
    }
  },
  { "$set": {
      "activity": {
        "$getField": {
          "field": "v",
          "input": {
            "$first": {
              "$objectToArray": { "$first": "$activity" }
            }
          }
        }
      }
    }
  },
  { "$unset": "_id" }
])

mongoplayground.net 上试用。

如果您的activitycollection有这个型号...

[
  {
    "occupation": "baker",
    "activity": "bakes"
  },
  {
    "occupation": "painter",
    "activity": "paints"
  }
]

... 那么查询可以是:

db.people.aggregate([
  { "$lookup": {
      "from": "activity",
      "localField": "occupation",
      "foreignField": "occupation",
      "as": "activity"
    }
  },
  { "$set": { "activity": { "$first": "$activity.activity" } } },
  { "$unset": "_id" }
])

mongoplayground.net 上试用。