2017-10-03 2 views
0

Je tente d'utiliser une requête qui recherchera dans ma base de données les caractères qui ont actuellement un élément spécifique, puis console.log les caractères.Recherche de 'Caractères' basés sur un 'item' spécifique (le personnage a un tableau d'éléments)?

Les articles sont réellement des modèles référencés.

Ex:

caractère

var characterSchema = new mongoose.Schema({ 
    name: String, 
    items: [ 
      { 
       type: mongoose.Schema.Types.ObjectId, 
       ref: "Item" 
      } 
     ] 
}); 

module.exports = mongoose.model("Character", characterSchema); 

article

var itemSchema = new mongoose.Schema({ 
    name: String, 
    owners: [ 
      { 
       type: mongoose.Schema.Types.ObjectId, 
       ref: "Character" 
      } 
     ] 
}); 

module.exports = mongoose.model("Item", itemSchema); 

Jusqu'à présent, je l'ai essayé:

Character.find({"items": "Greatsword"}, function(err, characters) { 
    if(err) { 
     console.log(err); 
    } else { 
     console.log(characters); 
    } 
}); 

je me suis dit cela ne fonctionnerait pas puisque « articles "dans le characte r est juste un tableau référençant des éléments, mais je ne sais pas où aller à partir d'ici ..

Répondre

0

Vous devez utiliser l'agrégation pour joindre les documents référencés, puis les rechercher.

Character.aggregate([ 
    // deconstruct array field (as you can't join on an array field) 
    { 
     $unwind: '$items' 
    }, 
    // join items collection 
    { 
     $lookup: { 
      from: 'items', // collection to join 
      localField: 'items', // field from the input documents 
      foreignField: '_id', // field from the documents of the "from" collection 
      as: 'item' // output array field 
     } 
    }, 
    // deconstruct array field 
    { 
     $unwind: '$item' 
    }, 
    // filter 
    { 
     $match: { 
      'item.name': 'Greatsword' 
     } 
    }, 
    // rebuild 
    { 
     _id: '_id', 
     name: { $first: '$name' }, 
     items: { $push: '$item' } 
    } 
], function (err, characters) { 

}); 

Pour plus d'informations, lisez

+0

Bon sang, semble beaucoup de travail pour quelque chose de si simple. Je vous remercie! –