如何根据MongoDB中的_id join 2个文档进行查询?
How to query by joining 2 documents based on the _id in MongoDB?
我有一个像下图这样的数据模型,它们都在同一个集合中,当然数据结构不同。我在文档电影和文档工作室中使用了手册参考。例如像下面的代码:
文档人
{
“_id”:100600,
"first_name": "贝卡",
"last_name": "巴特森",
"birth_day": "2001-10-03"
}
对于文档电影
{
“_id”:1100,
"title": "猫和老鼠",
“director_id”:100100,
“release_year”:2018年,
“IMDB”:{
“评级”:4.8,
“投票”:100
},
“演员”:[
{
“person_id”:100300,
“作为”:“汤姆”
},
{
“person_id”:100400,
“作为”:“杰瑞”
},
{
“person_id”:100500,
“作为”:“蚕食”
}
]
}
文档工作室:
{
“_id”:9991000,
"name": "华特迪士尼",
"year_founded": 1923,
“电影”: [
1100,
1200
],
“总部”:{
“地址”:“1375 E Buena Vista Dr”,
“城市”:“纽约”,
“状态”:“纽约”,
“国家”:“美国”
}
}
我有一些任务需要将 2 个文档连接在一起以获取数据。例如,”表示电影中演员的姓氏为“Battson”。但我知道 MongoDB 没有不支持连接文档,例如在 RDBMS 中连接 2 个表。
我曾尝试在 MongoDB shell 中使用下面的代码,但没有任何意义。我想我需要从结果查询中的 _id 中获取值,然后将它们推入数组 array_idActor 以便第二个代码可以 运行:
const array_idActor = db.getCollection('movies_subject').find({last_name: /Battson/})
db.getCollection('movies_subject').find({actors:{$elemMatch:{person_id:{$in:array_idActor}}}}).pretty()
请帮我解决这个问题。非常感谢。
加入两个collections
db.people.aggregate([
{
"$match": {
"last_name": "Battson"
}
},
{
"$lookup": {
"from": "movies",
"localField": "_id",
"foreignField": "actors.person_id",
"as": "movie_docs"
}
}
])
加入三collections
db.people.aggregate([
{
"$match": {
"last_name": "Battson"
}
},
{
"$lookup": {
"from": "movies",
"let": {
"people_id": "$_id"
},
"pipeline": [
{
"$match": {
$expr: {
"$in": [
"$$people_id",
"$actors.person_id"
]
}
}
},
{
"$lookup": {
"from": "studios",
"localField": "_id",
"foreignField": "movies",
"as": "studio_docs"
}
}
],
"as": "movie_docs"
}
}
])
一样collection
db.collection.aggregate([
{
"$match": {
"last_name": "Battson"
}
},
{
"$lookup": {
"from": "collection",
"localField": "_id",
"foreignField": "actors.person_id",
"as": "movie_docs"
}
}
])
我有一个像下图这样的数据模型,它们都在同一个集合中,当然数据结构不同。我在文档电影和文档工作室中使用了手册参考。例如像下面的代码:
文档人
{ “_id”:100600, "first_name": "贝卡", "last_name": "巴特森", "birth_day": "2001-10-03" }
对于文档电影
{ “_id”:1100, "title": "猫和老鼠", “director_id”:100100, “release_year”:2018年, “IMDB”:{ “评级”:4.8, “投票”:100 }, “演员”:[ { “person_id”:100300, “作为”:“汤姆” }, { “person_id”:100400, “作为”:“杰瑞” }, { “person_id”:100500, “作为”:“蚕食” } ] }
文档工作室:
{ “_id”:9991000, "name": "华特迪士尼", "year_founded": 1923, “电影”: [ 1100, 1200 ], “总部”:{ “地址”:“1375 E Buena Vista Dr”, “城市”:“纽约”, “状态”:“纽约”, “国家”:“美国” } }
我有一些任务需要将 2 个文档连接在一起以获取数据。例如,”表示电影中演员的姓氏为“Battson”。但我知道 MongoDB 没有不支持连接文档,例如在 RDBMS 中连接 2 个表。
我曾尝试在 MongoDB shell 中使用下面的代码,但没有任何意义。我想我需要从结果查询中的 _id 中获取值,然后将它们推入数组 array_idActor 以便第二个代码可以 运行:
const array_idActor = db.getCollection('movies_subject').find({last_name: /Battson/})
db.getCollection('movies_subject').find({actors:{$elemMatch:{person_id:{$in:array_idActor}}}}).pretty()
请帮我解决这个问题。非常感谢。
加入两个collections
db.people.aggregate([
{
"$match": {
"last_name": "Battson"
}
},
{
"$lookup": {
"from": "movies",
"localField": "_id",
"foreignField": "actors.person_id",
"as": "movie_docs"
}
}
])
加入三collections
db.people.aggregate([
{
"$match": {
"last_name": "Battson"
}
},
{
"$lookup": {
"from": "movies",
"let": {
"people_id": "$_id"
},
"pipeline": [
{
"$match": {
$expr: {
"$in": [
"$$people_id",
"$actors.person_id"
]
}
}
},
{
"$lookup": {
"from": "studios",
"localField": "_id",
"foreignField": "movies",
"as": "studio_docs"
}
}
],
"as": "movie_docs"
}
}
])
一样collection
db.collection.aggregate([
{
"$match": {
"last_name": "Battson"
}
},
{
"$lookup": {
"from": "collection",
"localField": "_id",
"foreignField": "actors.person_id",
"as": "movie_docs"
}
}
])