例如,如果我有以下Schema(为简洁起见,大大简化)。如何通过标签搜索帖子?如果嵌入了标记文档集合,我知道如何执行此操作,但我想将Tag保留在自己的集合中。
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 :(得分:4)
您应该能够使用mongoose的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);
});
}
);
答案 1 :(得分:3)
标签的Schema是最好的方法吗?像这样简单的东西应该有效:
Posts = new Schema({
title: String
body: String
tags: [String]
})
// ...
Posts.find({ tags: { $in: ['javascript'] }, function(err, posts){
console.log(posts)
})