Javascript 使用mongoose的嵌套数组查询
我正在使用mongoose(带nodejs)进行查询 我的数据库模型(缩小ofc)有以下模式: 现在我想给出一个例子(插入),我想用它来说明我的问题和愿望: (插入) 到目前为止还不错。。。现在我有了一个给定的日期,在这种情况下: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
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" } }
}
}
]);