【问题标题】:Mongo DB: How do I turn an array of documents into individual documents?Mongodb:如何将一组文档转换为单个文档?
【发布时间】:2012-11-20 11:55:20
【问题描述】:
{
 "teachers" : [
               {"name": "Lucy", "id": 3, course: "history"}, 
               {"name": "Mark", "id": 6, "course": "maths"}, 
               {"name": "Joan", "id": 20, course: "French"} 
               ] 
}

此文档在“学校”收藏中。我一直在尝试使用

访问这些嵌入的文档
db.school.find({teachers:{id:3}}) 

我也试过了

db.school.find({teacher.id:3})

但我知道它不起作用,因为 mongo 无法查看嵌入式数组。 因此,我想将这些嵌入的文档变成单独的文档。也就是说,删除嵌入和“教师”键,为每个教师创建一个单独的文档。

最终的“学校”收藏将是

{"name": "Lucy", "id": 3, "course": "history"}, 
{"name": "Mark", "id": 6, "course": "maths"}, 
{"name": "Joan", "id": 20, "course": "French"}

我想用 python 来做,并将新文档保存到一个集合中。

编辑

这是我现在想出的:

import pymongo
import sys

connection = pymongo.Connection("mongodb://localhost", safe=True)

db = connection.hello
shows = db.school

for doc in db.school:
    for indiv in "teachers":
            try:
            db.individual.insert(indiv)
        except:
            print "Unexpected error", sys.exc_info()[0]

【问题讨论】:

  • 问题是;是否可以转 {"teachers" : [{name:"Lucy", id:3, course:"history"}, {name:"Mark", id: 6, course:"maths"}, {name: "Joan", id:20, course:"French"} ] } 转化为 {name:"Lucy", id:3, course:"history"}, {name:"Mark", id: 6, course:"maths "}, {name:"Joan", id:20, course:"French"}
  • 我不明白。你是什​​么意思'可能'?用蟒蛇?使用 mongodb 控制台还是无论如何?
  • 我想用 python 来做,并将新文档保存到一个集合中。对不起,我不是很清楚..
  • 编写一个python脚本来进行这种数据库转换将是一种有效的方法。你也可以用 mongo shell 来做,因为它是一个成熟的 javascript 解释器,但是当你对 python 感觉更舒服时,就去吧。那么是什么阻止你这样做呢?
  • 也许您可以手动将数据从旧集合替换为新集合?是否需要使用脚本?

标签: python mongodb


【解决方案1】:

顺便说一句,Mongodb 可以找到数组中的嵌入文档:

db.school.find({ 'teachers.id' : 3 });

您可以在mongodb documentation 了解有关点符号的更多信息。

如果目标是仅返回嵌入文档,您可以使用aggregate 请求:

db.school.aggregate(
  {$match: { 'teachers.id' : 3 }}, 
  {$unwind : '$teachers'}, 
  {$project: { 
    _id: 0, 
    name: '$teachers.name',
    id: '$teachers.id', 
    course: '$teachers.course' 
  }}, 
  {$match: {id:3}}
);

【讨论】:

    【解决方案2】:
    school_records = db.school.find()
    for i in school_records:
        for teacher in i['teachers']:
            db.individual.insert(teacher)
    

    这个呢?

    【讨论】:

    • 非常感谢!是否可以使最终的_id与原始集合中的id相同?
    • 我认为这不是一个好主意(如果您使用默认 ObjectId)。但这是可能的。
    【解决方案3】:

    您可以使用 mongo v2.2+ 中的聚合命令(在 pymongo 中):

        fagg=db.school.aggregate([{$unwind: "$teachers"},
        {$project: {name: "$teachers.name", 
        id: "$teachers.id", course: "$teachers.course"}}])
        fagg.result.forEach(function(o){
        db.teachers.insert({_id: o.id, name: o.name, course: o.course})})
    

    【讨论】:

      猜你喜欢
      • 2021-02-21
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      • 2013-07-22
      • 1970-01-01
      相关资源
      最近更新 更多