📜  mongoose find 仅获取嵌套道具 - Javascript (1)

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

Mongoose Find 获取嵌套属性

简介

在MongoDB中,经常使用文档嵌套 (embedded documents) 来组织数据。Mongoose也支持文档嵌套,使用者可以方便地在一个文档里嵌套另外的文档或数组。但是,当我们只需要获取嵌套文档中的某些字段时,该如何做呢?

本文将介绍如何使用Mongoose的查询语法,通过指定查询字段的方式,仅获取文档嵌套中的某些属性。

示例

举个例子,假设我们有一个模型 (model) 如下所示:

var userSchema = new mongoose.Schema({
  name: { type: String, required: true },
  email: { type: String, unique: true },
  country: { type: String },
  address: {
    street: { type: String },
    city: { type: String },
    state: { type: String },
    zip: { type: String }
  }
});

var User = mongoose.model('User', userSchema);

在这个例子中,我们有一个用户 (User) 模型,它包含了嵌套属性 address。现在我们只需要获取 address 中的 street 和 city 字段,该如何实现呢?

首先,我们需要使用 Mongoose 的find方法并指定查询参数,如下:

User.find({ name: 'John Doe' }, function(err, users) {
  if (err) throw err;

  console.log(users);
});

这样的查询会返回name为 ‘John Doe’ 的所有用户的文档。

但是,如何指定只返回 address 中的 street 和 city 字段呢?

我们可以使用 Mongoose 的选择器 (select) 方法,它可以指定哪些文档字段需要显示,哪些不需要。在这个例子中,我们只需要以下两行代码即可:

User.find({ name: 'John Doe' }).select('address.street address.city').exec(function(err, users) {
  if (err) throw err;

  console.log(users);
});

这条语句首先会查询name为 ‘John Doe’ 的所有用户文档,然后使用 select() 方法指定只返回 address 嵌套对象中的 street 和 city 两个字段。结果如下:

{
  "_id": "6056c57e6d3e6d2b7f8b7565",
  "address": {
    "street": "123 Main St",
    "city": "San Francisco"
  }
}
总结

在Mongoose中,嵌套文档可以提供更为复杂的数据组织,同时,我们也需要注意如何更为高效地查询和过滤数据。选择器方法 select() 在此场景下非常有用,能够方便地对文档嵌套属性进行按需查询,提高查询效率。