在Mongoose中搜索嵌入式对象

时间:2011-12-05 18:56:57

标签: mongodb node.js mongoose

例如,如果我有以下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);
    });

2 个答案:

答案 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)
})