c# - 如何投影以从与过滤器不匹配的数组中删除属性
问题描述
我想过滤与过滤器匹配的文档,然后进行项目以删除不符合要求的数组值。在这个例子中,我需要 pickme1 和 pickme2 都为真。搜索 attr $eq 值
{
"_id" : ObjectId("qewrjkl"),
"attr" : "value",
"aray1" [
{
"pickme1" : true,
"data1" : "jklsdjk",
"aray2" [
{
"pickme2" : true,
"data2" : "treasure1"
},
{
"pickme2" : false,
"data2" : "trash1"
},
]
},
{
"pickme1" : false
"data1" : "jklsdjk",
"aray2" [
{
"pickme2" : true,
"data2" : "treasure2"
},
{
"pickme2" : false,
"data2" : "trash2"
},
]
},
]
}
应该产生
{
"_id" : ObjectId("qewrjkl"),
"attr" : "value",
"results" [
{"data2" : "treasure1"}
]
}
我从 collection.Aggregate().Match(filter).Lookup() 开始,认为我可以用查找填充数组,然后意识到这无济于事。在这一点上,我没有任何想法。有没有人有任何想法?如果在数组中找不到任何内容,则文档应该有一个空数组。
解决方案
聚合
db.collection.aggregate([
{
$addFields: {
aray1: {
$filter: {
input: {
$map: {
input: "$aray1",
as: "a1",
in: {
aray2: {
$filter: {
input: "$$a1.aray2",
as: "ia2",
cond: {
$eq: [
"$$ia2.pickme2",
true
]
}
}
},
pickme1: "$$a1.pickme1",
data1: "$$a1.data1"
}
}
},
as: "oa1",
cond: {
$eq: [
"$$oa1.pickme1",
true
]
}
}
}
}
},
{
"$project": {
result: "$aray1.aray2",
attr: 1
}
},
{
"$project": {
"result.data2": 1,
attr: 1
}
}
])
工作Mongo游乐场
推荐阅读
- python-3.x - 使用命令提示符执行 Python 脚本
- flutter - 我如何在颤动中记录秒表时间
- java - 如何通过目录循环 XSLT 转换?
- react-native - React Native IAP getSubscriptions 返回 iOS 的空数组
- node.js - Nodejs lambda 请求函数获取 411 长度要求
- flutter - 如何使用构建体内的 onpressed 调用显示对话框
- javascript - 第一次聚焦 textInput 时键盘立即关闭
- c# - 将值添加到 DataGridview 中的特定单元格
- ruby-on-rails - 如何将变量从控制器传递到rails中的部分视图文件?
- python - 如何在 Pandas 数据框中将 ISO-8601 对象转换为 DateTime 格式?