控制台使用forEach对查询的数据进行循环遍历更改
db.user.find({ "bizExtData": { "$exists": true } })
.forEach(doc => {
var jsonObject = JSON.parse(doc.bizExtData);
for (let key in jsonObject) {
if (jsonObject[key] === null) {
delete jsonObject[key];
}
}
db.user.updateOne(
{ "_id": doc._id },
{
"$set": { "bizData": jsonObject },
"$unset": { "bizExtData": "" }
});
});
采用map给数组中的元素新增字段
db.form.updateMany(
{
_id:NumberLong("584329312069619715"),
treeCode:{ $regex: "MYDC" },
"items.orderNum": { "$exists": false }
},
[{
$set: {
items: {
$map: {
input: "$items",
as: "item",
in: {
$mergeObjects: [
"$$item",
{ orderNum: "$$item.number" }
]
}
}
}
}
}]
)
使用聚合的方式给数组中的元素新增字段
db.form_snapshot.aggregate([
{ $match: {
"items": { "$type": "array" },
"items.orderNum": { "$exists": false }
}
},
{
$set: {
items: {
$map: {
input: "$items",
as: "item",
in: {
$mergeObjects: [
"$$item",
{ orderNum: "$$item.number" }
]
}
}
}
}
},
{
$merge: {
into: "form_snapshot",
whenMatched: "merge",
whenNotMatched: "fail"
}
}
]);
聚合操作示例
const results = db.resource_tree.aggregate(
[
{
$match: {
type: "NOTICE",
name: "运营版导入",
},
},
{
$group: {
_id: { agencyId: "$agencyId" },
count: {
$sum: 1,
},
agencyId: { $first: "$agencyId" },
parentCode: { $first: "$parentCode" },
name: { $first: "$name" },
acode: { $first: "$code" },
items: {
$push: {
id: "$_id",
oldCode: "$code",
name: "$name",
agencyId: "$agencyId",
label: "$label",
},
},
},
},
{
$match: {
count: { $gt: 1 },
},
},
{
$addFields: {
filteredItems: {
$filter: {
input: "$items",
as: "item",
cond: {
$regexMatch: {
input: "$$item.oldCode",
regex: {
$concat: ["^", "$acode", ".*"],
},
},
},
},
},
},
},
{
$addFields: {
filteredItems: {
$map: {
input: "$filteredItems",
as: "item",
in: {
code: "$$item.oldCode",
name: "$$item.name",
agencyId: "$$item.agencyId",
label: "$$item.label",
},
},
},
},
},
{
$addFields: {
tree1: {
$arrayElemAt: [
{
$filter: {
input: "$filteredItems",
as: "item",
cond: {
$eq: [
{ $strLenCP: "$$item.code" },
4,
],
},
},
},
0,
],
},
tree2: {
$arrayElemAt: [
{
$filter: {
input: "$filteredItems",
as: "item",
cond: {
$eq: [
{ $strLenCP: "$$item.code" },
9,
],
},
},
},
0,
],
},
},
},
{
$addFields: {
items: {
$map: {
input: "$items",
as: "item",
in: {
$mergeObjects: [
"$$item",
{
$cond: {
if: {
$eq: [
{ $strLenCP: "$$item.oldCode" },
4,
],
},
then: "$tree1",
else: "$tree2",
},
},
],
},
},
},
},
},
{
$unwind: {
path: "$items",
},
},
{
$replaceRoot: {
newRoot: {
name: "$items.name",
_id: "$items.id",
agencyId: "$items.agencyId",
code: "$items.oldCode",
newCode:"$items.code",
type:"NOTICE",
label: {
$cond: {
if: { $eq: ["$items.oldCode", "$items.code"] },
then: "Y",
else: "N",
},
},
},
},
}
]).toArray();
if (results.length > 0) {
db.repair_temp.insertMany(results, { ordered: false });
db.repair_temp.find({ "label": 'N',"type":"NOTICE"}).forEach(doc => {
db.notice.updateMany({
"agencyId": doc.agencyId,
"treeCode": doc.code
},
{
"$set": { "treeCode": doc.newCode },
});
});
} else {
print("No documents to insert.");
};