2011-04-11 6 views
2

Je veux obtenir tous les élèves dont la dernière note est entre 15 et 20. Pour ce faire, j'effectue la requête suivante dans mon mongoDB en utilisant mongoose: les modèles fonctionnent bien (toutes les autres requêtes sont correctes).

Pupils.find({"marks[-1].value": {'$lt' : 20 }, "marks[-1].value" : { '$gt' : 15 }}, function(err, things){ 

Ce ne fonctionne pas, est-il quelque chose que je manqué?

* MISE À JOUR *

J'ai trouvé quelque chose comme:

Pupils.find({ "marks[-1].value": {$gt : 15, $lt : 20}}); 

Mais cela ne fonctionne pas non plus. Y at-il un moyen d'obtenir la dernière marque du tableau de marques dans ce cas?

Répondre

4

Lets considérer votre Pupils collection:

Pupils 
{ 
    _id, 
    Marks(integer), 
    LatestMark(int) 
} 

Je suggère d'ajouter marque dernière dans le document élèves (comme vous pouvez le voir le document ci-dessus), et le mettre à jour chaque fois que vous l'ajout d'une nouvelle marque dans la collection imbriquée. Ensuite, vous serez en mesure de requête sur elle comme ceci:

db.Pupils.find({ "LatestMark": {$gt : 15, $lt : 20}}); 

Aussi, vous pouvez dernière marque requête à l'aide $where, mais soyez soins parce que:

Javascript exécute plus lentement que les opérateurs natifs, mais est très flexible

+0

Je pensais aussi à aller dans cette direction mais je ne savais pas vraiment si c'était la bonne façon. Tu m'as convaincu :) Merci beaucoup pour ton aide. – Luc

+0

@Luc: Ne vous souciez pas de l'ajout de champ supplémentaire, mongodb ajustement parfait pour la dénormalisation (et toute base de données de documents en général). –

0

Je crois que cela ne fonctionne pas parce que les collections incorporées dans mongo sont accédées comme ceci: "marks.0.value", bien que je n'ai pas utilisé mongoose. Malheureusement pour votre scénario, je ne pense pas qu'il existe un moyen d'utiliser l'indexation négative. (Mongo ne garantit pas un ordre naturel préservé sauf si vous utilisez une collection limitée de toute façon si)

Vous pouvez être en mesure d'y parvenir en utilisant Map/Reduce ou une commande de groupe

http://www.mongodb.org/display/DOCS/MapReduce

+0

pensez-vous qu'il existe un moyen d'obtenir uniquement les derniers éléments des marques? – Luc

-1

Ceci est un conseil plutôt qu'une réponse.

Utilisez des guillemets doubles pour les mots clés spéciaux comme $ elemMatch, $ get, $ lt etc tout en utilisant Mangoose.

Dans le code suivant, $ gt va ne fonctionne pas correctement.

var elmatch = { companyname: mycompany }; 
    var condition = { company_info: { $elemMatch: elmatch } }; 

    if(isValid(last_id)){ 
     condition._id = { $gt: new ObjectId(last_id) }; 
    } 
    console.log(condition); 

    User.find(condition).limit(limit).sort({_id: 1}).exec(function (err, lists) { 
     if (!err) { 
      res.send(lists); 
      res.end(); 
     }else{ 
      res.send(err); 
      res.end(); 

     } 
    }); 

Mais cette question est résolu lorsque j'utilise des guillemets doubles des mots-clés spéciaux

var elmatch = { companyname: mycompany }; 
    var condition = { company_info: { "$elemMatch": elmatch } }; 

    if(isValid(last_id)){ 
     condition._id = { "$gt": new ObjectId(last_id) }; 
    } 
    console.log(condition); 

    User.find(condition).limit(limit).sort({_id: 1}).exec(function (err, lists) { 
     if (!err) { 
      res.send(lists); 
      res.end(); 
     }else{ 
      res.send(err); 
      res.end(); 

     } 
    }); 

J'espère que ce sera utile.

Questions connexes