Поиск встроенных объектов в Mongoose - PullRequest
5 голосов
/ 05 декабря 2011

Например, если у меня есть следующая схема (очень упрощенная для краткости).Как я могу искать сообщения по тегу?Я знаю, как это сделать, если коллекция документов тегов была встроена, но я хочу сохранить теги в их собственной коллекции.

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 ]

4 голосов
/ 06 декабря 2011

Вы можете использовать нотацию object.field с mongoose для запроса встроенных документов.Однако вам может потребоваться убедиться, что во встроенном документе есть все поля, объявленные как часть схемы по порядку (в вашем примере вы запрашиваете "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);
    });
  }
);
3 голосов
/ 06 декабря 2011

Является ли схема для тегов лучшим подходом? Что-то более простое, как это должно работать:

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

// ...

Posts.find({ tags: { $in: ['javascript'] }, function(err, posts){
    console.log(posts)
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...