Mongodb DSL常用操作

70 阅读1分钟

控制台使用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.");
};