gpt4 book ai didi

mongodb - 返回每组的最后一个 "true"值

转载 作者:IT老高 更新时间:2023-10-28 12:29:36 25 4
gpt4 key购买 nike

我收集了其中的文档:

{
_id: ObjectId(),
user: ObjectId(),
studentName: String,
createdAt: Date,
isAbondoned: boolean
}

文件示例如下:

1-

{ 
"_id" : ObjectId("56cd2d36a489a5b875902f0e"),
"user" : ObjectId("56c4cafabd5f92cd78ae49d4"),
"studentName" : "Aman",
"createdAt" : ISODate("2016-02-24T04:10:30.486+0000"),
"isAbandoned" : true
}

2-

{ 
"_id" : ObjectId("56cd2dcda489a5b875902fcd"),
"user" : ObjectId("56c4cafabd5f92cd78ae49d4"),
"studentName" : "Aman",
"createdAt" : ISODate("2016-02-24T04:13:01.932+0000"),
"isAbandoned" : false
}

3-

{ 
"_id" : ObjectId("56cee51503b7cb7b0eda9c4c"),
"user" : ObjectId("56c85244bd5f92cd78ae4bc1"),
"studentName" : "Rajeev",
"createdAt" : ISODate("2016-02-25T11:27:17.281+0000"),
"isAbandoned" : true,
}

现在我想找到他们的“isAbandoned”对于他们最后一个“createdAt”文档为真的学生列表。

上述示例所需的输出是:

{
"user" : ObjectId("56c85244bd5f92cd78ae4bc1"),
"studentName" : "Rajeev"
}

因为 studentName "Aman"max(createdAt) 是第二个文档,而 'isAbandoned' 是假的。

最佳答案

最好的方法是使用聚合框架。您需要 $group您的文档由“用户”返回,并使用 $last 返回每个用户的最后一个文档累加器运算符,但要使其正常工作,您需要使用 $sort 进行初步排序阶段。聚合管道运算符。要对文档进行排序,您需要同时考虑“createdAt”字段和“user”字段。

管道的最后一个阶段是 $match仅选择“isAbandoned”等于 true 的最后一个文档的阶段。

db.students.aggregate([
{ "$sort": { "user": 1, "createdAt": 1 } },
{ "$group": {
"_id": "$user",
"last": { "$last": "$$ROOT" }
}},
{ "$match": { "last.isAbandoned": true } }
])

返回如下内容:

{ 
"_id" : ObjectId("56c85244bd5f92cd78ae4bc1"),
"last" : {
"_id" : ObjectId("56cee51503b7cb7b0eda9c4c"),
"user" : ObjectId("56c85244bd5f92cd78ae4bc1"),
"studentName" : "Rajeev",
"createdAt" : ISODate("2016-02-25T11:27:17.281Z"),
"isAbandoned" : true
}
}

为了得到预期的结果,我们需要使用 $replaceRoot管道运算符(operator)从 3.4 版本开始将嵌入文档提升到顶层

{
$replaceRoot: { newRoot: "$last" }
}

在旧版本中,您需要使用 $project聚合管道操作来 reshape 我们的文档。因此,如果我们使用以下阶段扩展我们的管道:

{ 
"$project": {
"_id": "$last._id",
"user": "$last.user",
"studentName": "$last.studentName",
"createdAt": "$last.createdAt",
"isAbandoned": "$last.isAbandoned"
}}

它产生预期的输出:

{
"_id" : ObjectId("56cee51503b7cb7b0eda9c4c"),
"user" : ObjectId("56c85244bd5f92cd78ae4bc1"),
"studentName" : "Rajeev",
"createdAt" : ISODate("2016-02-25T11:27:17.281Z"),
"isAbandoned" : true
}

关于mongodb - 返回每组的最后一个 "true"值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37258334/

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