Hướng dẫn mongodb lookup dbref - mongodb tra cứu dbref

Trên thực tế, câu trả lời khác là sai. Có thể thực hiện tra cứu trên trường DBREF trong bộ tổng hợp của bạn và bạn không cần MapReduce cho điều đó.

Dung dịch

db.A.aggregate[[
{
    $project: { 
        B_fk: {
          $map: { 
             input: { 
                  $map: {
                      input:"$bid",
                      in: {
                           $arrayElemAt: [{$objectToArray: "$$this"}, 1]
                      },
                  }
             },
             in: "$$this.v"}},
        }
}, 
{
    $lookup: {
        from:"B", 
        localField:"B_fk",
        foreignField:"_id", 
        as:"B"
    }
}
]]

kết quả

{
    "_id" : ObjectId["59bb79df1e9c00162566f581"],
    "B_fk" : null,
    "B" : [ ]
},
{
    "_id" : ObjectId["582abcd85d2dfa67f44127e1"],
    "B_fk" : [
        ObjectId["582abcd85d2dfa67f44127e0"],
        ObjectId["582abcd85d2dfa67f44127e1"]
    ],
    "B" : [
        {
            "_id" : ObjectId["582abcd85d2dfa67f44127e0"],
            "status" : NumberInt["1"],
            "seq" : NumberInt["0"]
        }
    ]
}

Giải thích ngắn

Vòng lặp qua DBREF với $ MAP, chia mỗi DBREF thành một mảng, chỉ giữ trường $ id, sau đó loại bỏ định dạng K: V với $$ này. Bây giờ bạn có thể tra cứu trên ObjectID.

Giải thích từng bước

Trong bộ tổng hợp, loại DBREF BSON có thể được xử lý giống như một đối tượng, với hai hoặc ba trường [Ref, ID và DB].

Nếu bạn làm:

db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
            Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
            }

    },

]]

Đây là kết quả:

{
"_id" : ObjectId["582abcd85d2dfa67f44127e1"],
"First_DBref_as_array : [
    {
        "k" : "$ref",
        "v" : "B"
    },
    {
        "k" : "$id",
        "v" : ObjectId["582abcd85d2dfa67f44127e0"]
    }
],
"Second_DBref_as_array" : [
    {
        "k" : "$ref",
        "v" : "B"
    },
    {
        "k" : "$id",
        "v" : ObjectId["582abcd85d2dfa67f44127e0"]
    }
]
}

Khi bạn đã biến DBREF thành một mảng, bạn có thể thoát khỏi các trường vô dụng bằng cách truy vấn giá trị tại INDEX 1, như thế này:

db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$arrayElemAt: [{$objectToArray:{$arrayElemAt:["$bid",0]}},1]},
            Second_DBref_as_array: {$arrayElemAt: [{$objectToArray:{$arrayElemAt:["$bid",0]}},1]},
            }

    },

]]

result:

{
    "_id" : ObjectId["582abcd85d2dfa67f44127e1"],
    "First_DBref_as_array" : {
        "k" : "$id",
        "v" : ObjectId["582abcd85d2dfa67f44127e0"]
    },
    "Second_DBref_as_array" : {
        "k" : "$id",
        "v" : ObjectId["582abcd85d2dfa67f44127e0"]
    }
}

Sau đó, cuối cùng bạn cũng có thể nhận được giá trị bạn muốn bằng cách chỉ vào "$ myValue.v", giống như thế này

db.A.aggregate[[
    {
        $project: { 
            first_DBref_as_array: {$arrayElemAt: [{$objectToArray:{$arrayElemAt:["$bid",0]}},1]},
            second_DBref_as_array: {$arrayElemAt: [{$objectToArray:{$arrayElemAt:["$bid",0]}},1]},
            }

    },
    {
        $project: {
            first_DBref_as_ObjectId: "$first_DBref_as_array.v",
            second_DBref_as_ObjectId: "$second_DBref_as_array.v"
        }
    }

]]

result:

{
    "_id" : ObjectId["582abcd85d2dfa67f44127e1"],
    "first_DBref_as_ObjectId" : ObjectId["582abcd85d2dfa67f44127e0"],
    "second_DBref_as_ObjectId" : ObjectId["582abcd85d2dfa67f44127e0"]
}

Rõ ràng, trong một đường ống thông thường, bạn không cần tất cả các bước dư thừa này, sử dụng bản đồ $ lồng nhau, bạn có thể nhận được kết quả tương tự trong một lần đi:

db.A.aggregate[[
    {
        $project: { 
            B_fk: { $map : {input: { $map: {    input:"$bid",
                                    in: { $arrayElemAt: [{$objectToArray: "$$this"}, 1 ]}, } },
                            in: "$$this.v"}},

            }
    }, 

]]

result:

{
    "_id" : ObjectId["582abcd85d2dfa67f44127e1"],
    "B_fk" : [
        ObjectId["582abcd85d2dfa67f44127e0"],
        ObjectId["582abcd85d2dfa67f44127e1"]
    ]
}

Tôi hy vọng lời giải thích đủ rõ ràng, nếu không cảm thấy thoải mái khi hỏi.

Báo cáo vấn đề:

Mặc dù sử dụng đường ống tổng hợp trên bộ sưu tập có DBREF cho bộ sưu tập khác, nhưng việc sử dụng $ Lookup không giải quyết được giá trị do trường

db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
            Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
            }

    },

]]
2 trong tài liệu tham khảo.

Hãy tưởng tượng chúng ta có một bộ sưu tập gọi là

db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
            Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
            }

    },

]]
3 với cấu trúc sau.

{
    "_id" : ObjectId["59bb79df1e9c00162566f581"],
    "B_fk" : null,
    "B" : [ ]
},
{
    "_id" : ObjectId["582abcd85d2dfa67f44127e1"],
    "B_fk" : [
        ObjectId["582abcd85d2dfa67f44127e0"],
        ObjectId["582abcd85d2dfa67f44127e1"]
    ],
    "B" : [
        {
            "_id" : ObjectId["582abcd85d2dfa67f44127e0"],
            "status" : NumberInt["1"],
            "seq" : NumberInt["0"]
        }
    ]
}
0

DBREF trong ví dụ này chỉ ra một tài liệu trong bộ sưu tập người dùng có

db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
            Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
            }

    },

]]
4 trong trường
db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
            Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
            }

    },

]]
5 của nó.

Để giải quyết, trường ____ 26 chúng ta cần sử dụng giai đoạn

db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
            Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
            }

    },

]]
7, có cú pháp như được đưa ra dưới đây nhưng sẽ không hoạt động, do sự hiện diện của
db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
            Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
            }

    },

]]
8 trong tên trường.

{
    "_id" : ObjectId["59bb79df1e9c00162566f581"],
    "B_fk" : null,
    "B" : [ ]
},
{
    "_id" : ObjectId["582abcd85d2dfa67f44127e1"],
    "B_fk" : [
        ObjectId["582abcd85d2dfa67f44127e0"],
        ObjectId["582abcd85d2dfa67f44127e1"]
    ],
    "B" : [
        {
            "_id" : ObjectId["582abcd85d2dfa67f44127e0"],
            "status" : NumberInt["1"],
            "seq" : NumberInt["0"]
        }
    ]
}
1

Dung dịch:

Một trong những cách giải quyết tôi tìm thấy để giải quyết

db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
            Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
            }

    },

]]
9 với toán tử
db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
            Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
            }

    },

]]
7, là với sử dụng toán tử
{
"_id" : ObjectId["582abcd85d2dfa67f44127e1"],
"First_DBref_as_array : [
    {
        "k" : "$ref",
        "v" : "B"
    },
    {
        "k" : "$id",
        "v" : ObjectId["582abcd85d2dfa67f44127e0"]
    }
],
"Second_DBref_as_array" : [
    {
        "k" : "$ref",
        "v" : "B"
    },
    {
        "k" : "$id",
        "v" : ObjectId["582abcd85d2dfa67f44127e0"]
    }
]
}
1,
{
"_id" : ObjectId["582abcd85d2dfa67f44127e1"],
"First_DBref_as_array : [
    {
        "k" : "$ref",
        "v" : "B"
    },
    {
        "k" : "$id",
        "v" : ObjectId["582abcd85d2dfa67f44127e0"]
    }
],
"Second_DBref_as_array" : [
    {
        "k" : "$ref",
        "v" : "B"
    },
    {
        "k" : "$id",
        "v" : ObjectId["582abcd85d2dfa67f44127e0"]
    }
]
}
2 và
{
"_id" : ObjectId["582abcd85d2dfa67f44127e1"],
"First_DBref_as_array : [
    {
        "k" : "$ref",
        "v" : "B"
    },
    {
        "k" : "$id",
        "v" : ObjectId["582abcd85d2dfa67f44127e0"]
    }
],
"Second_DBref_as_array" : [
    {
        "k" : "$ref",
        "v" : "B"
    },
    {
        "k" : "$id",
        "v" : ObjectId["582abcd85d2dfa67f44127e0"]
    }
]
}
3.

Ý tưởng đằng sau điều này là bằng cách nào đó, trích xuất giá trị

db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
            Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
            }

    },

]]
2 trong trường
db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
            Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
            }

    },

]]
6 và sau đó sử dụng toán tử
db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
            Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
            }

    },

]]
7 để có được kết quả mong muốn.

{
    "_id" : ObjectId["59bb79df1e9c00162566f581"],
    "B_fk" : null,
    "B" : [ ]
},
{
    "_id" : ObjectId["582abcd85d2dfa67f44127e1"],
    "B_fk" : [
        ObjectId["582abcd85d2dfa67f44127e0"],
        ObjectId["582abcd85d2dfa67f44127e1"]
    ],
    "B" : [
        {
            "_id" : ObjectId["582abcd85d2dfa67f44127e0"],
            "status" : NumberInt["1"],
            "seq" : NumberInt["0"]
        }
    ]
}
2

sẽ trả về kết quả:

{
    "_id" : ObjectId["59bb79df1e9c00162566f581"],
    "B_fk" : null,
    "B" : [ ]
},
{
    "_id" : ObjectId["582abcd85d2dfa67f44127e1"],
    "B_fk" : [
        ObjectId["582abcd85d2dfa67f44127e0"],
        ObjectId["582abcd85d2dfa67f44127e1"]
    ],
    "B" : [
        {
            "_id" : ObjectId["582abcd85d2dfa67f44127e0"],
            "status" : NumberInt["1"],
            "seq" : NumberInt["0"]
        }
    ]
}
3

Giải trình:

Giai đoạn 1:

{
    "_id" : ObjectId["59bb79df1e9c00162566f581"],
    "B_fk" : null,
    "B" : [ ]
},
{
    "_id" : ObjectId["582abcd85d2dfa67f44127e1"],
    "B_fk" : [
        ObjectId["582abcd85d2dfa67f44127e0"],
        ObjectId["582abcd85d2dfa67f44127e1"]
    ],
    "B" : [
        {
            "_id" : ObjectId["582abcd85d2dfa67f44127e0"],
            "status" : NumberInt["1"],
            "seq" : NumberInt["0"]
        }
    ]
}
4

Chuyển đổi đối tượng tác giả từ tham chiếu DBREF thành mảng của các cặp giá trị khóa và trích xuất cặp giá trị khóa của

db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
            Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
            }

    },

]]
2 trong trường
db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
            Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
            }

    },

]]
6

{
    "_id" : ObjectId["59bb79df1e9c00162566f581"],
    "B_fk" : null,
    "B" : [ ]
},
{
    "_id" : ObjectId["582abcd85d2dfa67f44127e1"],
    "B_fk" : [
        ObjectId["582abcd85d2dfa67f44127e0"],
        ObjectId["582abcd85d2dfa67f44127e1"]
    ],
    "B" : [
        {
            "_id" : ObjectId["582abcd85d2dfa67f44127e0"],
            "status" : NumberInt["1"],
            "seq" : NumberInt["0"]
        }
    ]
}
5

Giai đoạn 2:

{
    "_id" : ObjectId["59bb79df1e9c00162566f581"],
    "B_fk" : null,
    "B" : [ ]
},
{
    "_id" : ObjectId["582abcd85d2dfa67f44127e1"],
    "B_fk" : [
        ObjectId["582abcd85d2dfa67f44127e0"],
        ObjectId["582abcd85d2dfa67f44127e1"]
    ],
    "B" : [
        {
            "_id" : ObjectId["582abcd85d2dfa67f44127e0"],
            "status" : NumberInt["1"],
            "seq" : NumberInt["0"]
        }
    ]
}
6

Bản đồ giá trị của khóa

db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
            Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
            }

    },

]]
2 cho trường
db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
            Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
            }

    },

]]
6.

{
    "_id" : ObjectId["59bb79df1e9c00162566f581"],
    "B_fk" : null,
    "B" : [ ]
},
{
    "_id" : ObjectId["582abcd85d2dfa67f44127e1"],
    "B_fk" : [
        ObjectId["582abcd85d2dfa67f44127e0"],
        ObjectId["582abcd85d2dfa67f44127e1"]
    ],
    "B" : [
        {
            "_id" : ObjectId["582abcd85d2dfa67f44127e0"],
            "status" : NumberInt["1"],
            "seq" : NumberInt["0"]
        }
    ]
}
7

Giai đoạn 3:

{
    "_id" : ObjectId["59bb79df1e9c00162566f581"],
    "B_fk" : null,
    "B" : [ ]
},
{
    "_id" : ObjectId["582abcd85d2dfa67f44127e1"],
    "B_fk" : [
        ObjectId["582abcd85d2dfa67f44127e0"],
        ObjectId["582abcd85d2dfa67f44127e1"]
    ],
    "B" : [
        {
            "_id" : ObjectId["582abcd85d2dfa67f44127e0"],
            "status" : NumberInt["1"],
            "seq" : NumberInt["0"]
        }
    ]
}
8

Sử dụng toán tử

db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
            Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
            }

    },

]]
7 để tìm nạp trường cục bộ
db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
            Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
            }

    },

]]
6 từ bộ sưu tập
db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$arrayElemAt: [{$objectToArray:{$arrayElemAt:["$bid",0]}},1]},
            Second_DBref_as_array: {$arrayElemAt: [{$objectToArray:{$arrayElemAt:["$bid",0]}},1]},
            }

    },

]]
3

{
    "_id" : ObjectId["59bb79df1e9c00162566f581"],
    "B_fk" : null,
    "B" : [ ]
},
{
    "_id" : ObjectId["582abcd85d2dfa67f44127e1"],
    "B_fk" : [
        ObjectId["582abcd85d2dfa67f44127e0"],
        ObjectId["582abcd85d2dfa67f44127e1"]
    ],
    "B" : [
        {
            "_id" : ObjectId["582abcd85d2dfa67f44127e0"],
            "status" : NumberInt["1"],
            "seq" : NumberInt["0"]
        }
    ]
}
9

Giai đoạn 4:

db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
            Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
            }

    },

]]
0

Bản đồ

db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
            Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
            }

    },

]]
6 Trường loại mảng đến trường đối tượng.

db.A.aggregate[[
    {
        $project: { 
            First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
            Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
            }

    },

]]
1

Ghi chú:

Theo tài liệu tài liệu tài liệu tài liệu của Mongo DB - Hướng dẫn sử dụng MongoDB

Trừ khi bạn có một lý do thuyết phục để sử dụng DBREF, hãy sử dụng các tài liệu tham khảo thủ công thay thế.

Bài Viết Liên Quan

Chủ Đề