📜  在 mongoose 中查询关系数据 (1)

📅  最后修改于: 2023-12-03 15:07:44.469000             🧑  作者: Mango

在 Mongoose 中查询关系数据

在 Mongoose 中,我们可以使用 populate() 方法来查询关联的数据。populate() 方法用于将引用的文档替换为真正的对象。在本文中,我们将介绍如何在 Mongoose 中查询关系数据。

1. 关系数据

在 Mongoose 中,有三种关系数据:一对一关系、一对多关系和多对多关系。

一对一关系:一个文档关联另一个文档,每个文档只能有一个关联的文档。

一对多关系:一个文档关联多个文档,每个关联的文档只能有一个主文档。

多对多关系:多个文档可以关联多个文档,每个文档可以有多个关联的文档。

2. 在 Mongoose 中定义关系

在 Mongoose 中,我们可以使用 ref 属性来定义关系。ref 属性指定要引用的模型名称。

const userSchema = new Schema({
  name: String,
  friends: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User'
  }]
});

在上面的代码中,我们定义了一个用户模型,其中使用 ObjectId 类型的数组 friends 引用了 User 模型。

3. 在 Mongoose 中查询关系数据

在 Mongoose 中,我们可以使用 populate() 方法来查询关联的数据。populate() 方法返回一个 Promise,可以使用 then() 和 catch() 方法处理结果。

User.findById(id)
  .populate('friends')
  .exec(function(err, user) {
    if (err) return handleError(err);
    console.log(user.friends);
  });

在上面的代码中,我们使用 findById() 方法查找一个用户,然后使用 populate() 方法来将该用户的朋友数组(friends)替换为真正的对象。最后,我们使用 exec() 方法来执行查询并处理结果。

4. 指定要查询的字段

在 Mongoose 中,我们可以使用 select() 方法来指定要查询的字段。select() 方法接受一个字符串或一个对象作为参数。

User.findById(id)
  .populate('friends', '-email')
  .exec(function(err, user) {
    if (err) return handleError(err);
    console.log(user.friends);
  });

在上面的代码中,我们使用 select() 方法指定要查询的字段。使用字符串作为参数可以排除某些字段,使用对象作为参数可以选择要查询的字段。

5. 指定查询条件

在 Mongoose 中,我们可以使用 where() 方法来指定查询条件。where() 方法接受一个查询条件对象作为参数。

User.find()
  .where('name').regex(/john/i)
  .populate('friends')
  .exec(function(err, users) {
    if (err) return handleError(err);
    console.log(users);
  });

在上面的代码中,我们使用 where() 方法指定查询条件。在这个例子中,我们使用正则表达式查询用户名中包含“john”的用户,并使用 populate() 方法来获取他们的朋友数组。