I use Mongoose.js and cannot solve problem with 3 level hierarchy document.
There 2 ways to do it.
First - without refs.
C = new Schema({
'title': String,
});
B = new Schema({
'title': String,
'c': [C]
});
A = new Schema({
'title': String,
'b': [B]
});
I need to show C record. How can i populate / find it, knowing only _id of C?
I was try use:
A.findOne({'b.c._id': req.params.c_id}, function(err, a){
console.log(a);
});
But i dont know how to get from returnet a object only c object that i need.
Second if working with refs:
C = new Schema({
'title': String,
});
B = new Schema({
'title': String,
'c': [{ type: Schema.Types.ObjectId, ref: 'C' }]
});
A = new Schema({
'title': String,
'b': [{ type: Schema.Types.ObjectId, ref: 'B' }]
});
How to populate all B, C records to get hierarchy?
I was try to use something like this:
A
.find({})
.populate('b')
.populate('b.c')
.exec(function(err, a){
a.forEach(function(single_a){
console.log('- ' + single_a.title);
single_a.b.forEach(function(single_b){
console.log('-- ' + single_b.title);
single_b.c.forEach(function(single_c){
console.log('--- ' + single_c.title);
});
});
});
});
But it will return undefined for single_c.title. I there way to populate it?
Thanks.
I'm late to this, but I wrote a Mongoose plugin that makes it extremely simple to perform deep model population. For your example, you can do this to populate
b
andc
:You can also specify Mongoose populate options for each of the populated paths, like this:
Check out the plugin documentation for more information.
in Mongoose 4 you can populate multilevel like this (even in different database or instance)
As of Mongoose 3.6 the ability to recursively populate related documents in a query has been added. Here is an example of how you might do it:
In this case, I am populating an array of id's in 'refUserListItems' with their referenced documents. The result of the query then gets passed into another populate query that references the field of the original populated document that I want to also populate - 'refSuggestion'.
Note the second (internal) populate - this is where the magic happens. You can continue to nest these populates and tack on more and more documents until you have built your graph the way you need it.
It takes a little time to digest how this is working, but if you work through it, it makes sense.
In Mongoose 4 you can populate documents across multiple levels:
Say you have a User schema which keeps track of the user's friends.
Firstly
populate()
lets you get a list of user friends. But what if you also wanted a user's friends of friends? In that case, you can specify apopulate
option to tell mongoose to populate thefriends
array of all the user's friends:Taken from: http://mongoosejs.com/docs/populate.html#deep-populate