mongodb - 根据给定文档的值是否在数组中创建具有布尔值的新字段
问题描述
鉴于我有一组 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") ] }
我想在下面的聚合管道中创建一个新字段,该字段评估给定的文档 ID1
是否-1
存在于上述 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 } }
])
推荐阅读
- azure - 如何在 Azure 数据工厂 V2 中设置项目级参数
- docusignapi - 如何将已签名的文档作为附件取回
- json - JSON - 期待'EOF',得到','
- python - 在 Python 中获取下一对字典
- linux - 杀死后的未知错误没有成功终止:信号初始化进程导致“权限被拒绝”\n:未知'
- angular - Angular useHash=true,从中排除特定路由
- c# - 在托管服务中使用时,asp.net core AppSettings 失败
- python - h5py 查看器无法打开它/以编程方式调用
- marklogic - Marklogic 二级排序如何工作?
- python-3.x - 如何将数据列表(括号中的每个值)转换为 python 列表形式?