0
{
 "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})

しかし、モンゴは埋め込まれた配列の中を見ることができないため、機能していないことを理解しています。したがって、これらの埋め込みドキュメントを個別のドキュメントに変えたいと考えています。つまり、埋め込みと「教師」キーを削除して、教師ごとに個別のドキュメントを作成します。

最終的な「学校」コレクションは

{"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]
4

3 に答える 3

2

ところで、Mongodb は配列にある埋め込みドキュメントを見つけることができます。

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

ドット表記の詳細については、mongodb のドキュメントを参照してください。

目的が埋め込みドキュメントのみを返すことである場合は、集約リクエストを使用できます。

db.school.aggregate(
  {$match: { 'teachers.id' : 3 }}, 
  {$unwind : '$teachers'}, 
  {$project: { 
    _id: 0, 
    name: '$teachers.name',
    id: '$teachers.id', 
    course: '$teachers.course' 
  }}, 
  {$match: {id:3}}
);
于 2012-11-20T12:45:28.237 に答える
1

mongo v2.2 +からaggregateコマンド(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})})
于 2012-11-20T12:35:10.037 に答える
1
school_records = db.school.find()
for i in school_records:
    for teacher in i['teachers']:
        db.individual.insert(teacher)

これはどうですか?

于 2012-11-20T12:30:27.237 に答える