MongoDB 日常问题小结

explain 分析查询语句

db.test.find({
	x: 1,
}).explain();
db.test.aggregate([
	{
		$match: {
			x: 1,
		}
	},
], {
	explain: true,
});

mongodb Sort exceeded memory limit of 104857600 bytes, but did not opt in to external sorting.

错误原因: 在 MongoDB 中,内存中排序有 100M 的限制,若要执行大型排序,需要启用 allowDiskUse 选择将数据写入临时文件中以进行排序。
db.test.aggregate([
	{
		$sort: {
			x: -1,
		},
	}
], {
	allowDiskUse: true,
});

聚合查询优化

MongoDB 在使用聚合查询操作时,需要显式地排序操作,否则性能上会有很大的差别。要完整合理地使用 aggregate 操作语法,合理安排sort、lookup、match 的顺序,尽可能使 SQL 性能表现最大化。

MongoDB 可视化工具推荐,NoSQLBooster for MongoDB

  • https://www.cnblogs.com/makesense/p/15806011.html
  • https://www.cnblogs.com/barrywu/p/12090868.html

筛选比较同一个文档中两个字段的大小

场景: 修正已兑数, 根据`活动总数 - 剩余数`计算出实际已兑数, 筛选出所有状态为上架且已兑数大于实际已兑数的文档

{
    "_id": ObjectId("636ddb678593d90055308f3b"),
    "status": NumberInt("1"),
    "use_count": NumberInt("0"),
    "total_count": NumberInt("3"),
    "remain_count": NumberInt("0"),
    "created_at": ISODate("2022-11-11T05:19:35.103Z"),
    "updated_at": ISODate("2022-11-17T00:13:00.09Z"),
    "__v": NumberInt("0")
}

db.stores.aggregate([
    {
        $match: {
            "status": 1
        }
    },
    {
        $addFields: {
            "new_use_count": {
                $subtract: ['$total_count', '$remain_count']
            }
        }
    },
    {
        $match: {
            $expr: {
                $gt: ["$use_count", "$new_use_count"]
            }
        }
    },
    {
        $project: {
            "use_count": 1,
            "total_count": 1,
            "remain_count": 1,
            "new_use_count": 1
        }
    }
])

MongoDB 使用 findOneAndModify 处理并发问题

MongoDB 的 findOneAndModify 方法在高并发的环境下会出现问题。由于它使用了乐观锁机制,可能会引起多个进程之间的竞争。此外,如果多个进程同时尝试修改相同的文档,则可能会出现冲突,导致某些进程的更改被覆盖。

你可能感兴趣的:(MongoDB,mongodb)