gpt4 book ai didi

node.js - 在 MongoDB 中聚合后查找

转载 作者:可可西里 更新时间:2023-11-01 09:11:59 24 4
gpt4 key购买 nike

{
"_id" : ObjectId("5852725660632d916c8b9a38"),
"response_log" : [
{
"campaignId" : "AA",
"created_at" : ISODate("2016-12-20T11:53:55.727Z")
},
{
"campaignId" : "AB",
"created_at" : ISODate("2016-12-20T11:55:55.727Z")

}]
}

我有一个包含数组的文档。我想选择所有那些在当前时间的最后 2 小时内没有 response_log.created_at 的文档,并且最近 24 小时内 response_log.created_at 的计数小于 3。

我不知道该怎么做。请帮忙

最佳答案

您可以使用聚合框架来过滤文档。具有 $match $redact 步骤的管道将进行过滤。

考虑运行以下聚合操作,其中 $redact 允许您使用 $cond 运算符处理逻辑条件,并使用系统变量 $$KEEP 来“保留”逻辑条件为真或 $$PRUNE 的文档以“删除”条件为假的文档。

这个操作类似于有一个$project管道,它选择集合中的字段并创建一个新字段来保存逻辑条件查询的结果,然后是后续的$match,除了 $redact 使用效率更高的单个流水线阶段:

var moment = require('moment'),
last2hours = moment().subtract(2, 'hours').toDate(),
last24hours = moment().subtract(24, 'hours').toDate();

MongoClient.connect(config.database)
.then(function(db) {
return db.collection('MyCollection')
})
.then(function (collection) {
return collection.aggregate([
{ '$match': { 'response_log.created_at': { '$gt': last2hours } } },
{
'$redact': {
'$cond': [
{
'$lt': [
{
'$size': {
'$filter': {
'input': '$response_log',
'as': 'res',
'cond': {
'$lt': [
'$$res.created_at',
last24hours
]
}
}
}
},
3
]
},
'$$KEEP',
'$$PRUNE'
]
}
}
]).toArray();
})
.then(function(docs) {
console.log(docs)
})
.catch(function(err) {
throw err;
});

说明

在上面的聚合操作中,如果执行第一个$match流水线步骤

collection.aggregate([
{ '$match': { 'response_log.created_at': { '$gt': last2hours } } }
])

返回的文档将是那些在当前时间最近 2 小时内没有 "response_log.created_at" 的文档,其中变量 last2hours 是使用 momentjs 库创建的使用 subtract API。


前面带有 $redact 的管道将通过使用 $cond 三元运算符进一步过滤上述文档,该运算符计算使用 $size 获取计数和 $filter 返回一个过滤后的数组,其中的元素与其他逻辑条件匹配

{ 
'$lt': [
{
'$size': {
'$filter': {
'input': '$response_log',
'as': 'res',
'cond': { '$lt': ['$$res.created_at', last24hours] }
}
}
},
3
]
}

$$KEEP 如果此条件为真或 $$PRUNE 以“删除”评估条件为假的文档。

关于node.js - 在 MongoDB 中聚合后查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43605730/

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