2011-12-05 17 views
5

Por ejemplo, si tengo el siguiente esquema (muy simplificado para la brevedad). ¿Cómo puedo buscar publicaciones por etiqueta? Sé cómo hacer esto si la colección de documentos de etiquetas está incrustada, pero quiero mantener Tag's en su propia colección.Búsqueda de objetos incrustados en 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

¿No debería ser 'Post.find ({ 'tags.name': 'javascript'})' en el código? –

+0

Sí Ricardo. Estaba tratando de recortar las cosas irrelevantes, poner la consulta incorrecta allí. Gracias por atrapar –

Respuesta

3

está teniendo un esquema de etiquetas el mejor enfoque? Algo más simple como esto debería funcionar:

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

// ... 

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

En este caso, creo que es correcto. Desde entonces, he recurrido al enfoque String Array más aceptado ... y usé una colección reducida de mapas que se describe aquí [enlace] (http://cookbook.mongodb.org/patterns/count_tags/) para obtener etiquetas exclusivas, etc. para salir de la mentalidad de la base de datos relacional. –

4

Usted debe ser capaz de utilizar la notación object.field con mangosta para consultar documentos incrustados. Sin embargo, es posible que necesite asegurarse de que su documento incrustado tenga todos los campos declarados como parte del esquema en orden (en su muestra, consulta en "comments.name" pero PostSchema no tiene campo de comentarios, ¿quizás esto está causando el problema?)

yo era capaz de obtener una prueba de concepto de trabajo como éste, que debe ejecutar con éxito tal y como son:

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

Disculpe mi fragmento de código inicial fue hella engañosa. Intenté tu enfoque antes de publicar pero si utilizas una matriz incrustada de ObjectId en lugar de solo un documento incrustado, lo que tienes arriba no funciona. –

Cuestiones relacionadas