首页 > 解决方案 > MongoDB使特定字段的所有键值成为自己的字段(Python)

问题描述

我当前的收藏有以下格式的文档

{'name': 'Bob',
'school': 'UCLA',
'sport': 'Basketball'
}

{'name': 'Bob',
'school': 'UCLA',
'sport': 'Soccer'
}


{'name': 'Bob',
'school': 'UCLA',
'sport': 'Tennis'
}

...

{'name': 'Caroline',
'school': 'UCSD',
'sport': 'Basketball'
}

{'name': 'Caroline',
'school': 'UCSD',
'sport': 'Soccer'
}


{'name': 'Bob',
'school': 'UCLA',
'sport': 'Volleyball'
}

我想做的是制作sport自己领域的所有值,但我不太确定如何实现。我已经尝试研究“切换”键值对的方法,但我找不到在 MongoDB 中使用 Python 的方法(例如:PyMongo)

{'name': 'Bob',
'school': 'UCLA',
'Basketball': 1
}

{'name': 'Bob',
'school': 'UCLA',
'Soccer':1
}


{'name': 'Bob',
'school': 'UCLA',
'Tennis':1
}

...

{'name': 'Caroline',
'school': 'UCSD',
'Basketball':1
}

{'name': 'Caroline',
'school': 'UCSD',
'Soccer':1
}


{'name': 'Bob',
'school': 'UCLA',
'Volleyball':1
}

标签: mongodbdatabase-designpymongo

解决方案


  • $arrayToObject将键值对转换为对象,k 是运动,v 是 1
  • $mergeObjects合并必填字段及以上转换对象
  • $replaceRoot将上述合并对象替换为根
db.collection.aggregate([
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          {
            name: "$name",
            school: "$school"
          },
          {
            $arrayToObject: [[{ k: "$sport", v: 1 }]]
          }
        ]
      }
    }
  }
])

操场


推荐阅读