gpt4 book ai didi

javascript - 使用 mongoose 进行嵌套数组查询

转载 作者:行者123 更新时间:2023-11-28 05:50:42 25 4
gpt4 key购买 nike

我正在使用 mongoose(带有 Nodejs)来进行查询。

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

var HistorySchema = new Schema({ 
status : String,
time : Date
});

var TaskSchema = new Schema({
game_id : Schema.Types.ObjectId,
history : [HistorySchema]
}, {collection: 'task'});

现在我想为此给出一个示例(插入),我想用它来展示我的问题和愿望:(插入)

{
"_id" : ObjectId("5772ca87439632101510fa6b"),
"history" :
[
{
"status" : "open",
"time" : ISODate("2016-06-25T12:17:46.982Z")
},
{
"status" : "complete",
"time" : ISODate("2016-06-30T12:17:46.982Z")
}
]
}

到目前为止一切顺利...现在我有一个给定的日期,在本例中:

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

关于javascript - 使用 mongoose 进行嵌套数组查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38102393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com