根据给定文档的值是否在数组中,使用布尔值创建新字段



鉴于我有 id 数组,例如:

db.calendars.aggregate([
{ '$match' : { _id: { '$in' : filtered_ids } }  },
{ '$group' : { _id: null, ids: { '$push' : '$_id' }  }  },
{ '$project' : {_id: 0, ids: 1} }
])
{ "ids" : [ ObjectId("5d9ce5d73ed1492058a3a2df"), ObjectId("5d9ce88e3ed14921b6e1a9f1"), ObjectId("5d9ce88e3ed14921b6e1a9f3") ] }

我想在下面的聚合管道中创建一个新字段,该字段的计算结果为1-1给定的文档 ID 是否存在于上述 id 数组中。实际上,我将能够按布尔值对文档进行排序。乍一看,'$cmp'运算符是合适的。

db.calendars.aggregate([
{ '$addFields' : { 'shared' : { '$cmp' : ['$_id', [ ObjectId("5d9ce5d73ed1492058a3a2df"), ObjectId("5d9ce88e3ed14921b6e1a9f1"), ObjectId("5d9ce88e3ed14921b6e1a9f3") ] ] } },
{ '$sort' : { shared: -1 }  }
])

但是"$cmp"运算符仅比较了这两个值。它不会像"$in"那样来比较一个值是否在值数组中。我的问题是,在比较值时,我如何纳入"$in"要求。

预期结果如下所示:

{ '_id' : Object('...'), name: 'New event', shared: -1 },
{ '_id' : Object('...'), name: 'Another event', shared: -1 },
{ '_id' : Object('...'), name: 'Cool event', shared: 1 },
{ '_id' : Object('...'), name: 'Wow, an event', shared: 1 },

您会看到文档如何按新字段排序吗?

$in返回一个布尔值,因此您可以使用$cond来设置1-1

db.calendars.aggregate([
{
$addFields: {
shared: {
$cond: [ { $in: [ "$_id", [ ObjectId("5d9ce5d73ed1492058a3a2df"), ObjectId("5d9ce88e3ed14921b6e1a9f1"), ObjectId("5d9ce88e3ed14921b6e1a9f3") ] ] }, 1, -1 ]
}
}
},
{ '$sort' : { shared: -1 }  }
])

或者,如果要简化,请在布尔值上运行$sort

db.calendars.aggregate([
{
$addFields: {
shared: {
$in: [ "$_id", [ ObjectId("5d9ce5d73ed1492058a3a2df"), ObjectId("5d9ce88e3ed14921b6e1a9f1"), ObjectId("5d9ce88e3ed14921b6e1a9f3") ] ] 
}
}
},
{ '$sort' : { shared: -1 }  }
])

最新更新