以下是我的MongoDb结构示例:
{
"id" : 1,
"children" : [
{
"id" : 2,
"status" : " fsdfsdf "
},
{
"id" : 3,
"status" : " ffdfg "
},
{
"id" : 4,
"status" : " fsdfsdfsdfdsf "
}
]
}
我想进行查询更新..查询必须修剪(删除空格和/或制表符) 所以我的记录将是:
{
"id" : 1,
"children" : [
{
"id" : 2,
"theText" : "fsdfsdf"
},
{
"id" : 3,
"status" : "ffdfg"
},
{
"id" : 4,
"status" : "fsdfsdfsdfdsf"
}
]
}
谢谢
答案 0 :(得分:3)
MongoDB不提供字符串运算符来修改我们的字符串开箱即用,但我们可以使用聚合框架构建一个,但是这个解决方案需要MongoDB 3.4或更新版本。
db.coll.aggregate([
{ "$addFields": {
"children": {
"$map": {
"input": "$children",
"as": "child",
"in": {
"id": "$$child.id",
"status": {
"$arrayElemAt": [
{ "$filter": {
"input": { "$split": [ "$$child.status", " " ] },
"as": "ch",
"cond": { "$gt": [ { "$strLenCP": "$$ch" }, 0 ]}
}},
0
]
}
}
}
}
}},
{ "$out": "coll" }
])
我们的管道中只需要一个阶段,即$project
阶段或$addFields
阶段。我选择使用$addFields
自动在结果中包含其他字段。
我们需要对“children”数组中的每个元素应用一个表达式,这对于$map
数组运算符来说是一个完美的工作。
在 in 表达式中,我们只需$split
我们在子字符串中的字符串,$filter
生成的数组,删除所有长度为的子字符串0 即可。
要返回字符串的长度,我们使用$strLenCP
运算符。
然后我们使用$arrayElemAt
运算符返回唯一剩余的字符串。
我们管道的最后一个阶段是$out
阶段,您可以将结果写入新集合或替换旧集合。
另一种方法是使用mapReduce
trim
空间并使用批量操作更新您的收藏:
db.coll.mapReduce(function() {
emit(
this._id,
this.children.map( child => {
return { "id": child.id, "status": child.status.trim() };
})
); }, function(key, value) {}, {"out": {"inline": 1 }}
)
更新部分留作读者练习。
答案 1 :(得分:0)
你需要编写一些客户端javascript。在mongo shell中你可以这样做:
RDD
答案 2 :(得分:0)
这是一种通过在MongoDB游标上的文档数组上执行javascript children.status
循环来修剪所有forEach
字段的方法:
db.COLLECTION_NAME.find({}).forEach(
function(doc){
db.COLLECTION_NAME.update({"_id":doc.id}, {"$set":{
children:doc.children.map(function(child){return Object.assign(
child,
{
status: child.status.trim()
}
)})
}})
}
)
当然,您需要更新COLLECTION_NAME和任何其他相关字段。您可能还想添加一些逻辑以确保值是您期望的类型。