我有一个状态数组,如下所示。
"statuses" : [
{
"name" : "In Progress",
"created_on" : ISODate("2020-04-20T19:00:07.681Z")
},
{
"name" : "Pending",
"created_on" : ISODate("2020-04-20T19:00:07.886Z")
},
{
"name" : "Viewed",
"created_on" : ISODate("2020-04-20T20:10:04.733Z")
},
{
"name" : "Initial Viewed",
"created_on" : ISODate("2020-04-20T20:10:08.468Z")
},
{
"name" : "Opened",
"created_on" : ISODate("2020-04-21T01:37:08.582Z")
},
{
"name" : "Completed",
"created_on" : ISODate("2020-04-21T01:48:46.007Z")
}
]我有另一个数组,使用它:
"reference": ['In Progress', 'Pending', 'Sent', 'Initial Viewed', 'Viewed', 'Opened', 'Completed']当我将我的第一个数组与引用数组进行比较时可以看到,第一个数组中缺少'Sent‘,我想用current ISODate()将其添加到我的第一个数组中。我还希望我的第一个数组和第二个数组的顺序相同。
发布于 2020-04-24 23:31:50
通过在reference上运行$map,您将获得所需的订单。$filter和$arrayElemAt可以让你找到一个匹配的元素,当没有匹配的时候,$ifNull可以用来构建新的对象:
db.collection.aggregate([
{
$project: {
result: {
$map: {
input: "$reference",
as: "ref",
in: {
$let: {
vars: {
matched: {
$arrayElemAt: [ { $filter: { input: "$statuses", cond: { $eq: [ "$$ref", "$$this.name" ] } } }, 0 ]
}
},
in: {
$ifNull: [ "$$matched", { name: "$$ref", created_on: new Date() } ]
}
}
}
}
}
}
}
])https://stackoverflow.com/questions/61411856
复制相似问题