MongoDB文档间的关系
1、一对一关系(内嵌文档)
一对一关系,就像中国一夫一妻,一个身份证号对应一个人一样,下面我士兵来做例子,每个士兵对应自己有一个技能。
执行完语令我们查看soldier表
db.soldier.insert([
{
Name:"霹雳火",
skill:{
skName:"雷霆半月斩"
}},{
Name:"龙卷风",
skill:{
skName:"闪电旋风劈"
}},{
Name:"冲击波",
skill:{
skName:"绝地流星锤"
}}
]);
当进入skill中 会出现skil中的数据,还会自带一个Id
2、一对多
//装备
db.arms.insert({
list:["能源紫水晶x5","能源紫水晶x5","小兵x10","专属武器x1"],
user_id:ObjectId("5e8f0b85e49d3b617265d186")
});
如上图将对应的装备给到对应的机车战士。
我们现在查询指定的人的武器
var findId = db.soldier.findOne({Name:"霹雳火"})._id;
db.arms.find({user_id :findId});
就可以清楚的看到霹雳火有四个装备,因为没展开,就不看详细数据了。(一对多,多对一基本一个道理)
3、多对多
老师与学生大部分呈现多对多关系,即一个老师可以有多个学生,一个学生可以有多个老师。
db.teachers.insert(
[{name:"风雪师傅"},
{name:"闪电师傅"},
{name:"银白将军师傅"}]
);
这是一张老师表执行后查询得到
现在将一张学生表建立
db.stus.insert([
{name:"龙卷风",
tech_id:[
ObjectId("5e93bad036c618bd4c80cc16"),
ObjectId("5e93bad036c618bd4c80cc17")
]},
{name:"霹雳火",
tech_id:[
ObjectId("5e93bad036c618bd4c80cc17"),
ObjectId("5e93bad036c618bd4c80cc16")
]
},
{name:"黑铁兽",
tech_id:[
ObjectId("5e93bad036c618bd4c80cc17"),
ObjectId("5e93bad036c618bd4c80cc18")
]
} ]);
然后我们以tree方式查询学生表
db.stus.find();
我们会发现,龙卷风,和霹雳火都对应了两个师傅。并且这两个师傅又对应了这两个学生,从而达到了,多对多的关系。
4、mongodb,sort和投影
1、小于或大于
这是我们的现有数据
db.emp.find({$or:[{age:{$lt:18}},{age:{$gt:21}}]});
如果写成了
db.emp.find({age:[{$lt:18,$gt:21}]});
代表且,小于18且大于21 因此即使运行也会没有数据。
2、查询指定字段
2.1 指定文档排序规则
db.emp.find({}).sort({age:-1,name:1});
以上代码,是进行sort排序,-1降序,1升序。
(还可使用limit,skip,sort)来控制显示数据
2.2 查询,可以在参数的位置来设置,查询结果的投影
db.emp.find({},{name:1,_id:0,gender:1});
其中1为指定显示,默认id会显示,不想显示则为0,
有声明显示字段后,默认不声明的字段会不显示出来。
4、结语
大部分IT技术虽然感觉不同,但其实技术都是相通的,不用想着都会,先一步一脚印,玩透一个,再打其他。