Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

MongoDB 对嵌套字段 (Hash/Object) 执行 $gt 大于查询

本文演示如何在 MongoDB 中对嵌套文档(Hash/Object)内的字段执行 $gt (Greater Than) 比较查询,使用 Dot Notation 访问嵌套字段。

创建示例数据

> db.performQueryDemo.insertOne({"PlayerDetails":{"PlayerScore":1000,"PlayerLevel":2},"PlayerName":"Chris"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7eba41a844af18acdffa9") }
> db.performQueryDemo.insertOne({"PlayerDetails":{"PlayerScore":0,"PlayerLevel":1},"PlayerName":"Robert"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7ebbb1a844af18acdffaa") }
> db.performQueryDemo.insertOne({"PlayerDetails":{"PlayerScore":-10,"PlayerLevel":0},"PlayerName":"Larry"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7ebd41a844af18acdffab") }
> db.performQueryDemo.insertOne({"PlayerDetails":{"PlayerScore":1,"PlayerLevel":1},"PlayerName":"David"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7ebe31a844af18acdffac") }

显示所有数据

> db.performQueryDemo.find().pretty();
{ "_id" : ObjectId("5cd7eba41a844af18acdffa9"), "PlayerDetails" : { "PlayerScore" : 1000, "PlayerLevel" : 2 }, "PlayerName" : "Chris" }
{ "_id" : ObjectId("5cd7ebbb1a844af18acdffaa"), "PlayerDetails" : { "PlayerScore" : 0, "PlayerLevel" : 1 }, "PlayerName" : "Robert" }
{ "_id" : ObjectId("5cd7ebd41a844af18acdffab"), "PlayerDetails" : { "PlayerScore" : -10, "PlayerLevel" : 0 }, "PlayerName" : "Larry" }
{ "_id" : ObjectId("5cd7ebe31a844af18acdffac"), "PlayerDetails" : { "PlayerScore" : 1, "PlayerLevel" : 1 }, "PlayerName" : "David" }

查询:PlayerDetails.PlayerScore > 0 的玩家

> db.performQueryDemo.find({"PlayerDetails.PlayerScore":{$gt:0}});

结果

{ "_id" : ObjectId("5cd7eba41a844af18acdffa9"), "PlayerDetails" : { "PlayerScore" : 1000, "PlayerLevel" : 2 }, "PlayerName" : "Chris" }
{ "_id" : ObjectId("5cd7ebe31a844af18acdffac"), "PlayerDetails" : { "PlayerScore" : 1, "PlayerLevel" : 1 }, "PlayerName" : "David" }

Dot Notation 访问嵌套字段

  • "PlayerDetails.PlayerScore" - 点号分隔层级,查询嵌套对象的字段
  • 支持任意深度:"level1.level2.level3.field"
  • 也适用于 Array 中的 Object:"items.0.price", "items.price" (匹配任一元素)

比较操作符完整列表

组合条件:分数 > 0 且等级 >= 2

db.performQueryDemo.find({
  "PlayerDetails.PlayerScore": { $gt: 0 },
  "PlayerDetails.PlayerLevel": { $gte: 2 }
});

索引优化建议

// 为嵌套字段创建索引
db.performQueryDemo.createIndex({ "PlayerDetails.PlayerScore": 1 });
db.performQueryDemo.createIndex({ "PlayerDetails.PlayerLevel": 1 });
// 或复合索引
db.performQueryDemo.createIndex({ "PlayerDetails.PlayerScore": 1, "PlayerDetails.PlayerLevel": 1 });

Aggregation 中的等效操作

db.performQueryDemo.aggregate([
  { $match: { "PlayerDetails.PlayerScore": { $gt: 0 } } },
  { $project: { PlayerName: 1, Score: "$PlayerDetails.PlayerScore", Level: "$PlayerDetails.PlayerLevel" } }
]);
Operator含义示例
$gt大于{ score: { $gt: 100 } }
$gte大于等于{ score: { $gte: 100 } }
$lt小于{ score: { $lt: 100 } }
$lte小于等于{ score: { $lte: 100 } }
$ne不等于{ score: { $ne: 100 } }
$in在数组中{ status: { $in: [1,2,3] } }
$nin不在数组中{ status: { $nin: [1,2,3] } }