Получение только последнего поля в mongoose $ в Operator - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь найти все записи о людях, которые находятся между началом и концом, и имеют идентификатор места в [1,2] Это мой запрос:

   Person.find({
        time: {
            $gte: start,
            $lt: end
        },
        "place.place_id": { $in: [1,2] }
    }, {
        "time":1,
        "place.$": 1
    },
    function (err, docs) {
        if (err) {
            res.status(500).send(err);
        } else {
            res.status(200).send(docs);
        }
    }
);

Но я получаю только одно место.Это мой вывод

[
{
    "_id": "5bffc1e9bd35e42020c05cf1",
    "time": "2018-11-29T10:38:01.401Z",
    "places": [
        {
            "_id": "5bffc1e9bd35e42020c05de3",
            "place_id": 1,
            "place_name": "test1"
        }
    ]
},
{
    "_id": "5bffc256bd35e42020c05de4",
    "time": "2018-11-29T10:40:01.324Z",
    "places": [
        {
            "_id": "5bffc256bd35e42020c05ed6",
            "place_id": 1,
            "place_name": "test1",
        }
    ]
}
]

Я получаю только место с идентификатором 1, мой желаемый вывод

[
{
    "_id": "5bffc1e9bd35e42020c05cf1",
    "time": "2018-11-29T10:38:01.401Z",
    "places": [
        {
            "_id": "5bffc1e9bd35e42020c05de3",
            "place_id": 1,
            "place_name": "test1"
        },
        {
            "_id": "5bffc1e9bd35e42020c05de3",
            "place_id": 2,
            "place_name": "test2"
        }
    ]
},
{
    "_id": "5bffc256bd35e42020c05de4",
    "time": "2018-11-29T10:40:01.324Z",
    "places": [
        {
            "_id": "5bffc256bd35e42020c05ed6",
            "place_id": 1,
            "place_name": "test1",
        },
        {
            "_id": "5bffc256bd35e42020c05ed6",
            "place_id": 2,
            "place_name": "test2",
        }
    ]
}
]

Обновление Попробовал, но это дает мне пустой объект

    Persons.find({
        time: {
            $gte: start,
            $lt: end
        },
        places: {
            $filter: {
               input: "$places",
               as: "place",
               cond: { $in: ["$$place.place_id",[ 1,2 ]] }
            }
         }  
    },
    function (err, docs) {
        if (err) {
            res.status(500).send(err);
        } else {
            res.status(200).send(docs);
        }
    }
);

};

Что я делаю не так ??Я также пробовал $ elemMatch, оператор $ all, но тот же вывод.

Как я могу получить все эти места?

Спасибо.

Update2

Я вводю данные через каждые 2 минутыэто начальное и конечное значения

var end = new Date();
var start = new Date(end);
start.setMinutes(end.getMinutes() - 10);

1 Ответ

0 голосов
/ 29 ноября 2018

Для этого нужно использовать агрегацию.Что-то вроде

db.collection.aggregate([
  { "$match": {
    "time": { "$gte": start, "$lt": end },
    "place.place_id": { "$in": [1, 2] }
  }},
  { "$project": {
    "time": 1,
    "places": {
      "$filter": {
        "input": "$places",
        "as": "place",
        "cond": { "$in": ["$$place.place_id", [1, 2]] }
      }
    }
  }}
])
...