仅获得猫鼬$ in运算符中的最后一个字段

时间:2018-11-29 10:48:28

标签: javascript node.js mongodb mongoose aggregation-framework

我正在尝试查找从开始到结束之间的所有人员记录,并且在[1,2]中具有地点ID。这是我的查询:

   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",
        }
    ]
}
]

我只会得到ID为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 :(得分:1)

您需要为此使用聚合。

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]] }
      }
    }
  }}
])