Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongoose 猫鼬的繁殖意味着什么?_Mongoose_Mongoose Populate - Fatal编程技术网

Mongoose 猫鼬的繁殖意味着什么?

Mongoose 猫鼬的繁殖意味着什么?,mongoose,mongoose-populate,Mongoose,Mongoose Populate,我遇到了下面一行我不理解的代码,虽然有很多教程提供了与填充示例相关的信息,但没有一个教程解释它的确切含义。下面是一个示例 var mongoose = require('mongoose'), Schema = mongoose.Schema var PersonSchema = new Schema({ name : String, age : Number, stories : [{ type: Schema.ObjectId, ref: 'Story' }] }

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

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"
})
mongoose中的
populate()
函数用于填充引用中的数据。在您的示例中,
StorySchema
具有
\u creator
字段,该字段将引用
\u id
字段,该字段基本上是mongodb文档的
ObjectId

函数可以接受字符串或对象作为输入

其中string是需要填充的字段名。在您的情况下,这是
\u 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]
“填充”还可以接受对象作为输入

您可以在这里找到mongoose的
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不会给我们带来太多麻烦

但如果我需要那个
\u创建者的名字,我需要再次请求在数据库中找到它。
除此之外,在mongoose中,我们有一个聪明的函数,名为populate(),我们可以链接到以前的请求,以便在回答中直接获取该信息,而无需明确执行其他请求

Story.findOne({ title: Nintendo }).populate('_creator')
会回来的

{
  _creator : {
       _id : A0jfdSMmEJj*9,
       name: Sai,
       age: 100,
       stories : [fdsfdsfdsew38u, 89hr3232, ...]
    },
    title    : Nintendo,
    fans     : [r432i900fds09809n, fdsjifdsjfueu88]
  }
}
{
  Bob : {
    _id : dasd348ew,
    email: bob@example.com,
    age: 25,
    job: teacher,
    nationality: American,
  }
}
{
  Bob : {
    job: teacher,
    email: bob@example.com,
  }
}
但也许,这是太多的信息,我们不希望他写的故事,他的年龄和名字是足够的。然后,Populate可以接受包含所需字段的其他参数

结果==>

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

填充是将文档中的指定路径自动替换为其他集合中的文档的过程。我们可以填充单个文档、多个文档、一个普通对象、多个普通对象或查询返回的所有对象。让我们看一些例子

让我解释一下,如果你正在写一篇博客文章,你想添加一个选项,内容读者可以知道写博客的人,这样你就可以用以下方式使用它:

Blog.findOne({title:a random blog})
另一方面,如果你想返回写博客的博主的id和信息,你可以这样做:

Blog.findOne({title:a random blog}).populate(blogger)
您可以在许多方面使用它,这只是一个例子。

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

没有.populate()的示例

会回来的

{
  _creator : {
       _id : A0jfdSMmEJj*9,
       name: Sai,
       age: 100,
       stories : [fdsfdsfdsew38u, 89hr3232, ...]
    },
    title    : Nintendo,
    fans     : [r432i900fds09809n, fdsjifdsjfueu88]
  }
}
{
  Bob : {
    _id : dasd348ew,
    email: bob@example.com,
    age: 25,
    job: teacher,
    nationality: American,
  }
}
{
  Bob : {
    job: teacher,
    email: bob@example.com,
  }
}
带有.populate()的示例

会回来的

{
  _creator : {
       _id : A0jfdSMmEJj*9,
       name: Sai,
       age: 100,
       stories : [fdsfdsfdsew38u, 89hr3232, ...]
    },
    title    : Nintendo,
    fans     : [r432i900fds09809n, fdsjifdsjfueu88]
  }
}
{
  Bob : {
    _id : dasd348ew,
    email: bob@example.com,
    age: 25,
    job: teacher,
    nationality: American,
  }
}
{
  Bob : {
    job: teacher,
    email: bob@example.com,
  }
}
正如你所读到的(我很感激),但它并不完整。因此,我决定写我自己的答案(因为此时编辑队列已满)

但是,如果您需要跨多个级别填充。我们可以获得用户朋友的列表,但是如果我们想检索用户朋友的朋友,我们可以这样点它:

const userSchema=新模式({
名称:String,
朋友:[{type:ObjectId,ref:'User'}]
});
用户。
findOne({name:'Val'})。
填充({
路径:'朋友',
//获取朋友的朋友-为每个朋友填充“朋友”数组
填充:{path:'friends'}
});

您可以将代码添加到您的问题中吗?当您查询
Populate()函数Populate…
时,Populate通常用于填充ref objects属性,这让我也感到恶心XD,非常感谢!解释得很清楚。非常感谢。如果一个用户已经出版了n本书,那么我怎样才能归还所有的文档呢?这应该是最好的答案;)有人能给我解释一下这个“-\u v”是什么意思吗。填充(“角色”,如果需要,我可以提供更多信息,但我觉得这是显而易见的,但我不知道。似乎这是一种自动加入(加入la SQL)。对吗?