2011-12-05 47 views
5

Ví dụ: nếu tôi có sơ đồ sau (rất đơn giản hóa cho ngắn gọn). Tôi làm cách nào để tìm kiếm bài đăng theo Thẻ? Tôi biết cách thực hiện việc này nếu thu thập tài liệu thẻ đã được nhúng nhưng tôi muốn giữ Thẻ trong bộ sưu tập của riêng họ.Tìm kiếm các đối tượng nhúng trong Mongoose

PostSchema = new Schema({ 
    title: String 
    body: String 
    tags: [{type: Schema.ObjectId, ref: 'Tag' }] 
}); 

TagSchema = new Schema({ 
    name: String 
}); 

// Here is what I've tried 
Post.find({'tags.name':'javascript'}) 
    .populate('tags') // Is it necessary to join the collections? 
    .run(function(err, posts) { 
     console.log('posts: ', posts); 
    }); 
+0

Không phải là 'Post.find ({' tags.name ':' javascript '}) 'trong mã của bạn? –

+0

Có Ricardo. Tôi đã cố gắng để cắt ra những thứ không liên quan đặt các truy vấn sai trong đó. Cảm ơn bạn đã chụp –

Trả lời

3

là có một Schema cho thẻ phương pháp tốt nhất? Một cái gì đó đơn giản như thế này sẽ hoạt động:

Posts = new Schema({ 
    title: String 
    body: String 
    tags: [String] 
}) 

// ... 

Posts.find({ tags: { $in: ['javascript'] }, function(err, posts){ 
    console.log(posts) 
}) 
+0

Trong trường hợp này tôi nghĩ chính xác của bạn. Tôi đã kể từ khi tái tham gia vào cách tiếp cận String Array được chấp nhận nhiều hơn .. và sử dụng một bộ sưu tập được sắp xếp bản đồ được nêu ra ở đây [link] (http://cookbook.mongodb.org/patterns/count_tags/) để đếm và các thẻ độc đáo, v.v ... để thoát ra khỏi bộ tư duy cơ sở dữ liệu quan hệ. –

4

Bạn sẽ có thể sử dụng ký hiệu object.field với mongoose để truy vấn tài liệu được nhúng. Tuy nhiên, bạn có thể cần đảm bảo rằng tài liệu được nhúng của bạn có tất cả các trường được khai báo như một phần của lược đồ theo thứ tự (trong mẫu của bạn, bạn truy vấn "comments.name" nhưng PostSchema không có trường nhận xét - có thể điều này đang gây ra sự cố?)

tôi đã có thể để có được một bằng chứng của khái niệm làm việc như thế này, mà nên chạy thành công như-là:

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

mongoose.connect('mongodb://localhost/testjs'); 


PostSchema = new Schema({ 
    title: String, 
    body: String, 
    comments: [], 
    tags: [{type: Schema.ObjectId, ref: 'Tag' }] 
}); 

TagSchema = new Schema({ 
    name: String 
}); 


var Post = mongoose.model('Post', PostSchema); 

var mypost = new Post() 
mypost.title = "yo" 
mypost.body = "asfkjabfkjbsdf" 
mypost.comments = [{'name':'javascript', 'text':'sup'}] 
mypost.save(
    function(err){ 
    // Save the post, and then read it back by querying the embedded field 
    Post.find({'comments.name':'javascript'},function(err, posts){ 
     console.log('posts: ', posts); 
    }); 
    } 
); 
+0

Tôi xin lỗi vì đoạn mã ban đầu của tôi đã gây hiểu nhầm. Tôi đã thử cách tiếp cận của bạn trước khi tôi đăng nhưng nếu bạn sử dụng một mảng nhúng của ObjectId thay vì chỉ là một tài liệu nhúng những gì bạn có ở trên không hoạt động. –

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