Javascript 使用mongoose的嵌套数组查询

Javascript 使用mongoose的嵌套数组查询,javascript,node.js,mongodb,mongoose,nested,Javascript,Node.js,Mongodb,Mongoose,Nested,我正在使用mongoose(带nodejs)进行查询 我的数据库模型(缩小ofc)有以下模式: 现在我想给出一个例子(插入),我想用它来说明我的问题和愿望: (插入) 到目前为止还不错。。。现在我有了一个给定的日期,在这种情况下: ISODate("2016-06-28T12:17:46.982Z") 现在,我想从集合中获取所有TaskSchema对象,包括数组中匹配的HistorySchmea对象。所以我想排除历史数组中不匹配的部分 我尝试了很多东西,比如$pull操作 db.task.fi

我正在使用mongoose(带nodejs)进行查询

我的数据库模型(缩小ofc)有以下模式:

现在我想给出一个例子(插入),我想用它来说明我的问题和愿望: (插入)

到目前为止还不错。。。现在我有了一个给定的日期,在这种情况下:

ISODate("2016-06-28T12:17:46.982Z")
现在,我想从集合中获取所有TaskSchema对象,包括数组中匹配的HistorySchmea对象。所以我想排除历史数组中不匹配的部分

我尝试了很多东西,比如$pull操作

db.task.find(
{
    "game_id": ObjectId("57711397893a97aa170aa983"),
    "history.time":{
        $lte: ISODate("2016-06-28T12:17:46.982Z")
    }
},{$pull: {
    "history": {
        time: {
            $gte: ISODate("2016-06-28T12:17:46.982Z")
        }
    }
  }
}
但我会犯这样的错误

Unsupported projection option: $pull: { history: { time: { $gte: new Date(1467116266982) } } }
有人知道我是如何实现这个疑问的吗?我已经为此工作了好几天,找不到任何帮助


提前谢谢

一种解决方案是使用聚合框架:

db.task.aggregate([
    {$match: {_id : ObjectId("5772ca87439632101510fa6b")}},
    {$unwind : "$history"},
    {$match :{"history.time" : 
              {
                  $lte: ISODate("2016-06-30T12:17:46.982Z"),
                  $gte: ISODate("2016-06-01T12:17:46.982Z")
              }
             }
    },
    {$group:
     {
         _id:"$_id",
         history: { $push:  { status: "$history.status", time: "$history.time" } }
     }
    }
]);

一种解决方案是使用聚合框架:

db.task.aggregate([
    {$match: {_id : ObjectId("5772ca87439632101510fa6b")}},
    {$unwind : "$history"},
    {$match :{"history.time" : 
              {
                  $lte: ISODate("2016-06-30T12:17:46.982Z"),
                  $gte: ISODate("2016-06-01T12:17:46.982Z")
              }
             }
    },
    {$group:
     {
         _id:"$_id",
         history: { $push:  { status: "$history.status", time: "$history.time" } }
     }
    }
]);

你好,谢谢。但这不符合我的要求。我希望在请求时将它们保留在其父对象中。这给了我一个匹配的对象数组(嵌套对象):另一个选项是:获取父对象的最新对象。(我认为这会更好)要将它们保留在父对象中,可以使用“$group”操作符。我编辑了答案,告诉我这是否是你想要的。是的。在我删除$gte后,它对我有效。非常感谢你。您可以告诉我如何仅获取嵌套数组的最新对象(按最新日期)吗?不客气;)要获得“最新的日期”,您可以这样做:db.task.aggregate([{$match:{{u id:ObjectId(“5772CA8743932101510FA6B”)},{$unwind:$history},{$sort:{“history.time”:-1},{$limit:1},});你好,谢谢。但这不符合我的要求。我希望在请求时将它们保留在其父对象中。这给了我一个匹配的对象数组(嵌套对象):另一个选项是:获取父对象的最新对象。(我认为这会更好)要将它们保留在父对象中,可以使用“$group”操作符。我编辑了答案,告诉我这是否是你想要的。是的。在我删除$gte后,它对我有效。非常感谢你。您可以告诉我如何仅获取嵌套数组的最新对象(按最新日期)吗?不客气;)要获得“最新的日期”,您可以这样做:db.task.aggregate([{$match:{{u id:ObjectId(“5772CA8743932101510FA6B”)},{$unwind:$history},{$sort:{“history.time”:-1},{$limit:1},});
db.task.aggregate([
    {$match: {_id : ObjectId("5772ca87439632101510fa6b")}},
    {$unwind : "$history"},
    {$match :{"history.time" : 
              {
                  $lte: ISODate("2016-06-30T12:17:46.982Z"),
                  $gte: ISODate("2016-06-01T12:17:46.982Z")
              }
             }
    },
    {$group:
     {
         _id:"$_id",
         history: { $push:  { status: "$history.status", time: "$history.time" } }
     }
    }
]);