在mongodb中对查询进行排序和分配



我想对一个集合进行排序,然后向结果添加一个虚拟属性,这是它们的数字顺序,其中结果显示为。

例如,我们有一个呼叫集合,我们想确定当前呼叫队列优先级为一个数字,以便它可以通过反向ETL同步到我们的CRM。

我们必须在查询本身内部完成,因为我们没有中间步骤可以引入任何逻辑来确定该逻辑。

所以我当前的查询是

db.getCollection('callqueues').aggregate([
{
$match: {
'invalidated': false,
'assigned_agent': null
}
},
{ $sort: {
score: -1, _id: -1
} },
{
$addFields: {
order: "<NEW ORDER PROPERTY HERE>",
}
},
])

所以我想知道我如何插入作为虚拟属性的顺序,其中排序后的第一个元素应该是1,第二个2,等等

一个选项(因为mongoDB版本5.0)是使用$setWindowFields:

db.collection.aggregate([
{$match: {invalidated: false, assigned_agent: null}},
{$setWindowFields: {
sortBy: {score: -1, _id: -1},
output: {
order: {
$sum: 1,
window: {documents: ["unbounded", "current"]}
}
}
}}
])

看看它在操场的例子中是如何工作的

编辑:如果您的mongoDB版本低于5.0,您可以使用效率较低的查询,涉及$group$unwind:

db.collection.aggregate([
{$match: {invalidated: false, assigned_agent: null}},
{$sort: {score: -1, _id: -1}},
{$group: {_id: 0, data: {$push: "$$ROOT"}}},
{$unwind: {path: "$data", includeArrayIndex: "order"}},
{$replaceRoot: {newRoot: {$mergeObjects: ["$data", {order: {$add: ["$order", 1]}}]}}}
])

看看它是如何在操场的例子中工作的<5.0

最新更新