Mongoose 的数量是什么意思?

cwxwcias  于 2022-11-24  发布在  Go
关注(0)|答案(6)|浏览(149)

我遇到了下面一行代码,我不能理解,虽然有很多教程提供了与populate的例子相关的信息,但没有一个解释它的确切含义。

var mongoose = require('mongoose'), Schema = mongoose.Schema

var PersonSchema = new Schema({
  name    : String,
  age     : Number,
  stories : [{ type: Schema.ObjectId, ref: 'Story' }]
});

var StorySchema = new Schema({
  _creator : {
     type: Schema.ObjectId,
     ref: 'Person'
  },
  title    : String,
  fans     : [{ type: Schema.ObjectId, ref: 'Person' }]
});

var Story  = mongoose.model('Story', StorySchema);
var Person = mongoose.model('Person', PersonSchema);
Story.findOne({ title: /Nintendo/i }).populate('_creator') .exec(function (err, story) {
if (err) ..
  console.log('The creator is %s', story._creator.name);
  // prints "The creator is Aaron"
})
swvgeqrz

swvgeqrz1#

我偶然遇到了这个问题,但我觉得我需要在这里提供帮助,即使它是旧的,因为我不相信它的解释方式:
Populate()函数填充...
这对英语母语者来说可能很清楚,但对其他人来说可能不是。
简而言之
“填充”将自动用其他集合中的文档替换文档中的指定路径。

长版本

让我们以您为例:

Story.findOne({ title: Nintendo })

将返回一个故事的那种:

{
  _creator : A0jfdSMmEJj9, //id of the creator (totally random, just for a clear example)
    title    : Nintendo,
    fans     : [r432i900fds09809n, fdsjifdsjfueu88] // again, totally random that I've typed here
  }
}

在某些情况下,这种要求就足够了,因为我们不关心作者或粉丝,所以,有一些ID不会打扰我们太多。
但是如果我需要_creator的名字,我需要再发出一个请求才能在数据库中找到它。不过,在mongoose中,我们有一个聪明的函数populate(),我们可以将它链接到我们之前的请求中,以便直接在我们的答案中获得该信息,而不需要显式地发出额外的请求。

Story.findOne({ title: Nintendo }).populate('_creator')

将返回

{
  _creator : {
       _id : A0jfdSMmEJj*9,
       name: Sai,
       age: 100,
       stories : [fdsfdsfdsew38u, 89hr3232, ...]
    },
    title    : Nintendo,
    fans     : [r432i900fds09809n, fdsjifdsjfueu88]
  }
}

但也许,这是太多的信息,我们不想他写的故事和他的年龄和姓名是足够的。

Story.findOne({ title: Nintendo }).populate('_creator', 'name age')

搜索结果==〉

{
  _creator : {
       name: Sai,
       age: 100,
    },
    title    : Nintendo,
    fans     : [r432i900fds09809n, fdsjifdsjfueu88]
  }
}
wtlkbnrh

wtlkbnrh2#

mongoose中的populate()函数用于填充引用中的数据。在您的示例中,StorySchema具有_creator字段,该字段将引用_id字段,该字段基本上是mongodb文档的ObjectId
populate()函数可以接受字符串或对象作为输入。
其中string是需要填充的字段名称。在您的情况下是_creator。mongoose从mongodb中找到一个文档后,结果如下所示

_creator: {
  name: "SomeName",
  age: SomeNumber,
  stories: [Set Of ObjectIDs of documents in stories collection in mongodb]
},
title: "SomeTitle",
fans: [Set of ObjectIDs of documents in persons collection in mongodb]

populate还可以接受对象作为输入。
你可以在这里找到mongoose的populate()函数的文档:http://mongoosejs.com/docs/2.7.x/docs/populate.htmlhttps://mongoosejs.com/docs/populate.html

rnmwe5a2

rnmwe5a23#

使用.populate()是为了只提供所需的信息。

不使用.populate()的示例

User.findOne({ name: Bob })

会回来的

{
  Bob : {
    _id : dasd348ew,
    email: bob@example.com,
    age: 25,
    job: teacher,
    nationality: American,
  }
}

使用.populate()的示例

User.findOne({ name: Bob }).populate("Bob", "job email")

会回来的

{
  Bob : {
    job: teacher,
    email: bob@example.com,
  }
}
5kgi1eie

5kgi1eie4#

当你读到this answer时(我很感激),但它并不完整。因此我决定写我自己的答案(因为此时编辑队列已满)。
但是如果你需要在多个级别上填充,我们可以得到一个用户的朋友列表,但是如果我们想检索一个用户的朋友的朋友,我们可以这样做:

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

User.
  findOne({ name: 'Val' }).
  populate({
    path: 'friends',
    // Get friends of friends - populate the 'friends' array for every friend
    populate: { path: 'friends' }
  });
ac1kyiln

ac1kyiln5#

User.findOne({ name: Broo }).populate("Broo", "job email")

会回来的

Broo: {
   job: "SMM",
   email: "broo@gmail.com"
}
68bkxrlz

68bkxrlz6#

填充是用其他集合中的文档自动替换文档中指定路径的过程。我们可以填充单个文档、多个文档、一个普通对象、多个普通对象或从查询返回的所有对象。让我们看一些示例。
让我来解释一下,如果你正在写一篇博客文章,你想添加一个选项,让内容阅读者知道写博客的人,这样你就可以按以下方式使用它:

Blog.findOne({title:a random blog})

另一方面,如果你想返回写博客的博客作者的id和信息,你可以这样做:

Blog.findOne({title:a random blog}).populate(blogger)

你可以在很多方面使用它,这只是一个例子。

相关问题