2011-12-05 8 views
5

たとえば、次のようなスキーマがある場合(簡潔にするために非常に簡略化されています)。タグで投稿を検索するにはどうすればよいですか?私は、タグのドキュメントコレクションが埋め込まれている場合、これを行う方法を知っていますが、自分のコレクションにTagを保持したいと思います。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

コード内に 'Post.find({'tags.name': 'javascript'})'はありませんか? –

+0

はいリカルド。私は無関係のものを間違ったクエリをそこに入れてトリムしようとしていた。キャッチしてくれてありがとう –

答えて

3

タグのスキーマ最善のアプローチを持っていますか?このような単純なものはうまくいくはずです:

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

// ... 

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

この場合、私はあなたの正しいと思います。私は以来、より受け入れられたString Arrayアプローチを考慮に入れました。ここで概要を説明したmapreducedコレクション(http://cookbook.mongodb.org/patterns/count_tags/)を使用して、数えられたタグやユニークなタグなどを取得しました。リレーショナルデータベースのマインドセットから抜け出す –

4

あなたは、埋め込まれたドキュメントを照会するためにマングースとobject.field表記を使用することができるはずです。しかし、埋め込まれた文書にスキーマの一部として宣言されているすべてのフィールドがあることを確認する必要があります(サンプルでは「comments.name」をクエリしますが、PostSchemaにコメントフィールドはありません。 )であるとして、正常に実行する必要があります

私はこのような作業コンセプトの証明を得ることができた、:

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

私の最初のコードスニペットが間違っていたことをお詫び申し上げます。あなたのアプローチを試してみましたが、埋め込まれたドキュメントの代わりにObjectIdの埋め込み配列を使用していれば、上記のことはうまくいきません。 –