node.js - Mongodb通过数组中的对象键查询并替换键
问题描述
如何查询所有有昵称的人并将昵称键替换为“nick”
数据集看起来像这样,有更多的字段和更多的文档。如果昵称 obj 存在,则它位于未知索引中。
{
_id: "robert",
properties: [
{
"kids": 3
},
{
"nickname": "Bob"
},
{
"age": 45
}
]
}
{
_id: "alice",
properties: [
{
"kids": 3
},
{
"age": 45
}
]
}
{
_id: "joseph",
properties: [
{
"nickname": "joe"
}
]
}
最后应该是:
{
_id: "robert",
properties: [
{
"kids": 3
},
{
"nick": "Bob"
},
{
"age": 45
}
]
}
{
_id: "alice",
properties: [
{
"kids": 3
},
{
"age": 45
}
]
}
{
_id: "joseph",
properties: [
{
"nick": "joe"
}
]
}
解决方案
以下查询可以解决问题。我们正在聚合collection
以将字段更改properties.nickname
为聚合输出properties.nick
并将现有数据替换collection
为聚合输出。
db.collection.aggregate([
{
$addFields:{
"properties":{
$map:{
"input":"$properties",
"as":"property",
"in":{
$mergeObjects:[
"$$property",
{
"nick":"$$property.nickname"
}
]
}
}
}
}
},
{
$project:{
"properties.nickname":0
}
},
{
$out:"collection"
}
])
前:
{
"_id" : "robert",
"properties" : [
{
"kids" : 3
},
{
"nickname" : "Bob"
},
{
"age" : 45
}
]
}
{
"_id" : "alice",
"properties" : [
{
"kids" : 3
},
{
"age" : 45
}
]
}
{ "_id" : "joseph", "properties" : [ { "nickname" : "joe" } ] }
后:
{
"_id" : "robert",
"properties" : [
{
"kids" : 3
},
{
"nick" : "Bob"
},
{
"age" : 45
}
]
}
{
"_id" : "alice",
"properties" : [
{
"kids" : 3
},
{
"age" : 45
}
]
}
{ "_id" : "joseph", "properties" : [ { "nick" : "joe" } ] }
推荐阅读
- python - Python 中 Google Search Console API 示例脚本的 JSONDecodeError
- java - REST API 中的线程“主”java.lang.IllegalArgumentException 中的异常
- java - Quarkus 扩展 (io.quarkus:quarkus-spring-data-jpa) 存储库无法返回字符串集合
- python - Jupyter 笔记本单元不打印任何内容
- excel - 等待 Context.sync 后如何将字符串转换为范围?
- c++ - 使用带有 LibZip 的 SDL_image 和 SDL_RWops 将 png 从 zip 加载到表面上,但无法识别 png
- python - 参数化值以在 Python 中过滤熊猫行
- python - 为什么使用 scikit-learn 管道时 self 不是类实例?
- javascript - 如何访问由参数传递的 JSON 密钥?
- python-3.x - 在 Python 中的每个字符串的开头和结尾添加一个空格