📜  如何在 mongodb 中获取另一个表的数据 (1)

📅  最后修改于: 2023-12-03 14:52:26.941000             🧑  作者: Mango

如何在 MongoDB 中获取另一个表的数据

在 MongoDB 中,获取另一个表的数据可以使用数据库引用方式,具体步骤如下:

1. 创建集合并插入数据

在 MongoDB 中新建一个数据库,例如 test,并在其中新建两个集合: usersorders,并分别插入数据。

use test

db.users.insertMany([
  { name: "Alice", age: 25 },
  { name: "Bob", age: 30 }
])

db.orders.insertMany([
  { user_id: ObjectId("60ed83312262d30c930fbed7"), product: "Toy Car", price: 20 },
  { user_id: ObjectId("60ed83312262d30c930fbed7"), product: "Doll", price: 15 },
  { user_id: ObjectId("60ed834f2b5a5b5f81b5fa5f"), product: "Football", price: 25 }
])

orders 集合中,user_id 字段使用的是 ObjectId 类型,表示此订单的用户是 users 集合中的哪个文档。

2. 创建引用

orders 集合中,user_id 字段可以用来引用 users 集合中的文档。要创建引用,可以使用 $lookup 操作符,在查询 orders 集合的同时查询 users 集合。

db.orders.aggregate([
    {
        $lookup:{
            from:"users",
            localField:"user_id",
            foreignField:"_id",
            as:"user"
        }
    }
])

输出结果如下:

{
    "_id" : ObjectId("60ed84022b5a5b5f81b5fa62"),
    "user_id" : ObjectId("60ed83312262d30c930fbed7"),
    "product" : "Toy Car",
    "price" : 20,
    "user" : [
        {
            "_id" : ObjectId("60ed83312262d30c930fbed7"),
            "name" : "Alice",
            "age" : 25
        }
    ]
}
{
    "_id" : ObjectId("60ed84022b5a5b5f81b5fa63"),
    "user_id" : ObjectId("60ed83312262d30c930fbed7"),
    "product" : "Doll",
    "price" : 15,
    "user" : [
        {
            "_id" : ObjectId("60ed83312262d30c930fbed7"),
            "name" : "Alice",
            "age" : 25
        }
    ]
}
{
    "_id" : ObjectId("60ed84022b5a5b5f81b5fa64"),
    "user_id" : ObjectId("60ed834f2b5a5b5f81b5fa5f"),
    "product" : "Football",
    "price" : 25,
    "user" : [
        {
            "_id" : ObjectId("60ed834f2b5a5b5f81b5fa5f"),
            "name" : "Bob",
            "age" : 30
        }
    ]
}

在查询 orders 集合时,使用的是 $lookup 操作符,这个操作符会从 users 集合中查询出与 orders 集合匹配的文档,并将相关数据作为 user 字段的值返回。

$lookup 操作符中,from 属性指定要查询的集合名称,localField 属性指定对应的外键字段名,foreignField 属性指定对应的主键字段名,as 属性指定查询结果的别名。

3. 结论

这样就实现了从一个集合中获取另一个集合的数据。通过创建引用,我们可以在查询 orders 集合时,同时查询 users 集合,并将相关数据返回。