mongodb - 如何有条件地删除字段 mongoodb
问题描述
我有一个集合,它的文档看起来像:
{
_id: ObjectId('111111111122222222223333'),
my_array: [
{
id: ObjectId('777777777788888888889999')
name: 'foo'
},
{
id: ObjectId('77777777778888888888555')
name: 'foo2'
}
//...
]
//more attributes
}
但是,有些文档有my_array: [{}]
(其中一个元素是一个空数组)。
如何有条件地添加或删除投影?
我必须在查询结束时将它添加到 mongo 管道中,并且我只想在my_array至少有一个不是空对象的元素时获取它。如果有一个空对象删除它。
我在投影阶段尝试过,$cond
但$eq
不支持。有什么建议可以解决这个问题吗?
解决方案
您不能在 a 中执行此操作query
,但是在聚合中您可以将$filter添加到管道中,如下所示:
db.collection.aggregate([
{
$project: {
my_array: {
$filter: {
input: "$my_array",
as: "elem",
cond: {
$ne: [
{},
"$$elem"
]
}
}
}
}
}
])
但是,除非这是“正确”的行为,否则我建议您清理数据库,维护“正确”结构比在任何地方更新所有查询要简单得多。
您可以使用此更新删除这些对象:
db.collection.update({
"myarray": {}
},
[
{
"$set": {
"my_array": {
$filter: {
input: "$my_array",
as: "elem",
cond: {
$ne: [
{},
"$$elem"
]
}
}
}
}
},
],
{
"multi": false,
"upsert": false
})
推荐阅读
- c# - 如何从 .net 核心中的 Worker 返回响应
- android - NestedScrollView 内的 ViewPager 内的 ScrollView 不滚动
- java - 如何在 Java Stream API 中重写`while(true)`
- ios - 来自用户的崩溃报告 - 最新手机上的应用程序崩溃
- flutter - 颤振/飞镖:如何在颤振中解压缩/膨胀zlib二进制字符串
- google-maps - React-Native Google Auto Complete - 未处理的承诺
- vba - 如何填充活动电子邮件中的字段?
- flutter - 使用不同高度的 ListView 创建水平 PageView
- jquery - 如何通过手机发送ajax?
- reactjs - 如何解决错误:调度期间未处理的拒绝