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 上试用。
如果您的activity
collection有这个型号...
[
{
"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 上试用。
我是 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 上试用。
如果您的activity
collection有这个型号...
[
{
"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 上试用。