2013-10-15 53 views
13

görünüyor ama ben bir yere tam bir cevap bulmak için görünmüyor olabilir.Gelincik iç içe sorgu

Ben Ne:

Ben Firma ve Kişi modelleri var:

var mongoose = require('mongoose'); 
var PersonSchema = new mongoose.Schema{ 
         name: String, 
         lastname: String}; 

// company has a reference to Person 
var CompanySchema = new mongoose.Schema{ 
         name: String, 
         founder: {type:Schema.ObjectId, ref:Person}}; 

Ben gerekenler:

soyad "Robertson" olan insanlar kurdu tüm şirketler bulun

denedim ne:

Company.find({'founder.id': 'Robertson'}, function(err, companies){ 
    console.log(companies); // getting an empty array 
}); 

Sonra Kişi gömülü fakat başvurulan olmadığını anladım, bu yüzden kurucusu-Kişi doldurmak için doldurulmasını kullanılan ve daha sonra

// 1. retrieve all companies 
// 2. populate their founders 
// 3. find 'Robertson' lastname in populated Companies 
Company.find({}).populate('founder') 
     .find({'founder.lastname': 'Robertson'}) 
     .exec(function(err, companies) { 
     console.log(companies); // getting an empty array again 
    }); 

Hala sorgulayabilir 'Robertson' lastname ile bulmak kullanmaya çalıştı Kişinin kimliğini String olarak gösteren şirketler. Ama tam olarak istediğim gibi değil.

Company.find({'founder': '525cf76f919dc8010f00000d'}, function(err, companies){ 
    console.log(companies); // this works 
}); 

cevap

27

MongoDB birleştirmeyi desteklemediği için bunu tek bir sorguda yapamazsınız. Bunun yerine, birkaç adımda içine kırmak zorunda:

// Get the _ids of people with the last name of Robertson. 
Person.find({lastname: 'Robertson'}, {_id: 1}, function(err, docs) { 

    // Map the docs into an array of just the _ids 
    var ids = docs.map(function(doc) { return doc._id; }); 

    // Get the companies whose founders are in that set. 
    Company.find({founder: {$in: ids}}, function(err, docs) { 
     // docs contains your answer 
    }); 
}); 
+0

Bir eklem benziyor ki haklısın. Uygulamayı düşündüğüm en basit iç içe geçmiş sorguyu verdim, muhtemelen ilişkisel DB'lerin daha kullanışlı olduğu durum budur. Ama neyse, çözümün işe yaradı. Thnx! – AzaFromKaza

+0

Merhaba, aynı soruna sahip olduğum için bu cevabı arıyordum, son bir soru olsa da, bu değişti mi yoksa 3.8.8 şimdi mi mümkün? Bu sorunun yayınlandığından beri farkettim. – maumercado

+0

@maumercado Hayır, değişmedi ve olması olası değil. – JohnnyHK

1

durumda herkes daha yakın zamanlarda bu rastlar, Gelincik geç Doldur olarak adlandırılan bir özellikle işlevselliği gibi katılmak destekler. Gelincik belgelerine

:

Story. 
findOne({ title: 'Casino Royale' }). 
populate('author'). 
exec(function (err, story) { 
    if (err) return handleError(err); 
    console.log('The author is %s', story.author.name); 
    // prints "The author is Ian Fleming" 

});

http://mongoosejs.com/docs/populate.html