mongoose node.js, запрос с $ lt и $ gt не работает - PullRequest
2 голосов
/ 12 апреля 2011

Я хочу получить всех учеников, чья последняя оценка составляет от 15 до 20. Для этого я выполняю следующий запрос в моем mongoDB, используя mongoose: Модели работают нормально (все остальные запросы в порядке).

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

Это не работает, я что-то пропустил?

* ОБНОВЛЕНИЕ *

Я нашел что-то вроде:

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

Но это тоже не работает. Есть ли способ получить последнюю отметку массива меток в этом случае?

Ответы [ 3 ]

5 голосов
/ 12 апреля 2011

Давайте рассмотрим вашу Pupils коллекцию:

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

Я предлагаю добавить последнюю отметку в документ Pupil (как вы можете видеть в документе выше) и обновлять ее каждый раз при добавлении новой отметки во вложенную коллекцию. Тогда вы сможете запросить его так:

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

Также вы можете запросить последнюю отметку, используя $, где , но будьте осторожны, потому что:

Javascript выполняется медленнее, чем родные операторы, но очень гибкие

0 голосов
/ 18 ноября 2015

Это подсказка, а не ответ.

Используйте двойные кавычки для специальных ключевых слов, таких как $ elemMatch, $ get, $ lt и т. Д. При использовании mangoose .

В следующем коде $ gt не будет работать должным образом.

    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();

        }
    });

Но эта проблема решена , когда я использую двойные кавычки для специальных ключевых слов

    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();

        }
    });

Надеюсь, это будет полезно.

0 голосов
/ 12 апреля 2011

Я считаю, что это не работает, потому что к встроенным коллекциям в mongo обращаются следующим образом: "marks.0.value", хотя я не использовал mongoose.

К сожалению, для вашего сценария я не думаю,Есть способ использовать отрицательную индексацию.(Mongo не гарантирует сохраненный естественный порядок, если вы все равно не используете ограниченную коллекцию)

Вы можете сделать это, используя Map / Reduce или групповую команду

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...