あなたが求めるものを正確に行うには、aggregationフレームワークを使用する必要があります。
ここで、あなたが収集した文書:fooを入力しました。私たちはその後、アグリゲーションパイプラインの私たちの最初の段階に入る私達の配列を解明するためにほどく$を使用し
> db.foo.find().pretty()
{
"_id" : ObjectId("57ceed3d31484d5b491eaae9"),
"subjects" : [
{
"name" : "English",
"teachers" : [
{
"name" : "Mark"
},
{
"name" : "John"
}
]
}
]
}
:
> db.foo.aggregate([
... {$unwind: "$subjects"}
... ]).pretty()
{
"_id" : ObjectId("57ceed3d31484d5b491eaae9"),
"subjects" : {
"name" : "English",
"teachers" : [
{
"name" : "Mark"
},
{
"name" : "John"
}
]
}
}
被験者は、[ので、ここでの唯一の違いは以下のいずれか少ないセットで長さ1の配列でした]配列の大括弧。
もう一度やり直す必要があります。
> db.foo.aggregate([
... {$unwind: "$subjects"},
... {$unwind: "$subjects.teachers"}
... ]).pretty()
{
"_id" : ObjectId("57ceed3d31484d5b491eaae9"),
"subjects" : {
"name" : "English",
"teachers" : {
"name" : "Mark"
}
}
}
{
"_id" : ObjectId("57ceed3d31484d5b491eaae9"),
"subjects" : {
"name" : "English",
"teachers" : {
"name" : "John"
}
}
}
長さ '2'の配列を2つの別々のドキュメントにしました。最初のものはsubjects.teachers.name = Markで、2番目のものはsubjects.teachers.name = Johnです。
私たちは、$ matchステージをパイプラインに追加する必要があるので、単にname = Markというケースを返すだけです。
> db.foo.aggregate([
... {$unwind: "$subjects"},
... {$unwind: "$subjects.teachers"},
... {$match: {"subjects.teachers.name": "Mark"}}
... ]).pretty()
{
"_id" : ObjectId("57ceed3d31484d5b491eaae9"),
"subjects" : {
"name" : "English",
"teachers" : {
"name" : "Mark"
}
}
}
OK!今我々は、名前:マークの場合にのみ一致している。
$プロジェクトケースを追加して、私たちの入力内容を形にしてみましょう。
> db.foo.aggregate([
... {$unwind: "$subjects"},
... {$unwind: "$subjects.teachers"},
... {$match: {"subjects.teachers.name": "Mark"}},
... {$project: {"name": "$subjects.teachers.name", "_id": 0}}
... ]).pretty()
{ "name" : "Mark" }
詳細についてはありがとうございます。 –
https://docs.mongodb.com/manual/reference/operator/aggregation/literal/#exp._S_literal 例: {$ project:{"name": "$ subjects.teachers .name "、" _id ":0、" address ":{$ literal:" 123 ABC "}}} – dyouberg
いいえ、私は情報をコレクションに更新することを意味します。コレクションは、なるように: { "科目":[ { "名": "英語"、 "先生":[ { "名": "マーク"、 "住所":「123 ABC XYZ」 は}、{ "名": "ジョン" } ] } ] } –