2013-10-15 23 views
13

Có vẻ như có rất nhiều Q/A về chủ đề này trên stackoverflow, nhưng tôi dường như không thể tìm thấy câu trả lời chính xác ở bất cứ đâu.Mongoose truy vấn lồng nhau trên Mô hình theo trường của mô hình được tham chiếu

Những gì tôi có:

Tôi có Công ty và người mẫu:

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}}; 

Những gì tôi cần:

Tìm tất cả các công ty mà mọi người với lastname "Robertson" đã thành lập

Tôi đã thử:

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

Sau đó, tôi đã tìm thấy người không được nhúng nhưng tham chiếu, vì vậy tôi sử dụng populate để cư sáng lập-Person và sau đó cố gắng sử dụng tìm thấy với lastname 'Robertson'

// 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 
    }); 

tôi vẫn có thể truy vấn các công ty có id của Person dưới dạng Chuỗi. Nhưng nó không chính xác những gì tôi muốn vì bạn có thể hiểu được

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

Trả lời

27

Bạn không thể làm điều này trong một truy vấn vì MongoDB không hỗ trợ kết nối. Thay vào đó, bạn phải phá vỡ nó thành một vài bước sau:

// 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

Bạn nói đúng, trông giống như mối nối. Tôi đã cho bạn truy vấn lồng nhau đơn giản nhất mà tôi đang nghĩ để triển khai, đó có thể là trường hợp mà DB quan hệ thuận tiện hơn. Nhưng dù sao, giải pháp của bạn đã hoạt động. Thnx! – AzaFromKaza

+0

Xin chào, tôi đang tìm câu trả lời này vì tôi có cùng một vấn đề, một câu hỏi cuối cùng, liệu điều này có thay đổi hoặc có thể xảy ra trên mongoose 3.8.5 bây giờ không? Tôi nhận ra kể từ khi câu hỏi này đã được đăng mongoose upped một vài phiên bản. – maumercado

+0

@maumercado Không, nó không thay đổi và không có khả năng. – JohnnyHK

1

Trong trường hợp bất cứ ai đi qua này trong thời gian gần đây hơn, Mongoose bây giờ hỗ trợ tham gia như chức năng với một tính năng gọi là cư.

Từ các tài liệu Mongoose:

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

Các vấn đề liên quan