Recipe 3-1. Data Model Using an Embedded Document(数据模型使用整合文档)
1.一对一的关系
比如:
{
_id: "James",
name: "James William"
}
{
student_id: "James",
street: "123 Hill Street",
city: "New York",
state: "US",
}
整合:
{
_id: "James",
name: "James William",
address: {
street: "123 Hill Street",
city: "New York",
state: "US",
}
}
2.一对多的关系
比如:
{
_id: "James",
name: "James William"
}
{
student_id: "James",
street: "123 Hill Street",
city: "New York",
state: "US",
}
{
student_id: "James",
street: "234 Thomas Street",
city: "New Jersey",
state: "US",
}
整合:
{
_id: "James",
name: "James William",
address: [{
street: "123 Hill Street",
city: "New York",
state: "US",
},
{
street: "234 Thomas Street",
city: "New Jersey",
state: "US",
}]
}
Recipe 3-2. Model Tree Structure with Parent References (模型树--Parent)
1.插入如下数据
db.author.insert( { _id: "Practical Apache Spark", parent:"Books" } )
db.author.insert( { _id: "MongoDB Recipes", parent: "Books" } )
db.author.insert( { _id: "Books", parent: "Subhashini" } )
db.author.insert( { _id: "A Framework For Extracting Information From Web Using VTD-XML ' s XPath", parent:"Article" } )
db.author.insert( { _id: "Article", parent: "Subhashini" } )
db.author.insert( { _id: "Subhashini", parent: null } )
2.树结构
Subhashii
Books Article
Practical Apache Spark A Framework For Extracting Information From Web Using VTD-XML
3.查询父级
db.author.findOne( { _id: "MongoDB Recipes" } ).parent
db.author.find( { parent: "Subhashini" } )
Recipe 3-3. Tree Structure with Child References (模型树--Child)
1.插入数据
db.author.insert( { _id: "Practical Apache Spark", children: [] } )
db.author.insert( { _id: "MongoDB", children: [] } )
db.author.insert( { _id: "Books", children: [ "Practical Apache Spark", "MongoDB Recipes" ] } )
db.author.insert( { _id: " A Framework For Extracting Information From Web Using VTD-XML ' s XPath ", children: [] } )
db.author.insert( { _id: "Article", children: [ " A Framework For Extracting Information From Web Using VTD-XML ' s XPath " ] } )
db.categories.insert( { _id: "Subhashini", children: ["Books","Article" ] } )
2.查询子级
db.author.findOne( { _id: "Books" } ).children
db.author.find( { children: "MongoDB Recipes" } )
Recipe 3-4. Tree Structure with an Array of Ancestors (模型树--数组Ancestors)
1.插入数据
db.author.insert( { _id: "Practical Apache Spark", ancestors: ["Subhashini", "Books" ], parent: "Books" } )
db.author.insert( { _id: "MongoDB Recipes", ancestors: ["Subhashini", "Books" ], parent: "Books" } )
db.author.insert( { _id: "Books", ancestors: [ "Subhashini" ],parent: "Subhashini" } )
db.author.insert( { _id: " A Framework For Extracting Information From Web Using VTD-XML ", ancestors: ["Subhashini", "Article" ], parent: "Article" } )
db.author.insert( { _id: "Article", ancestors: [ "Subhashini"], parent: "Subhashini" } )
db.author.insert( { _id: "Subhashini", ancestors: [ ], parent:null } )
2.查询ancestors
db.author.findOne( { _id: "MongoDB Recipes" } ).ancestors
db.author.find( { ancestors: "Subhashini" } )
Recipe 3-5. Aggregation Pipeline(整合渠道)
准备数据
db.orders.insertMany([
{custID:"10001",amount:500,status:"A"},
{custID:"10001",amount:250,status:"A"},
{custID:"10002",amount:200,status:"A"},
{custID:"10001",amount: 300, status:"D"}]);
1.仅仅需要custID
db.orders.aggregate( [ { $project : { custID : 1 , _id : 0 }} ] )
2.查询相当于group的语句,并查询总数
db.orders.aggregate({$group:{_id:"$custID",TotalAmount:{$sum:"$amount"}}});
3.使用$match来求总数
db.orders.aggregate({$match:{status:"A"}},{$group:{_id:"$custID",TotalAmount:{ $sum:"$amount"}}});
4.求平均数
db.orders.aggregate({$group:{_id:"$custID",AverageAmount:{$avg:"$amount"}}});
Recipe 3-6. Map-Reduce
准备数据
db.orders.insertMany([
{custID:"10001",amount:500,status:"A"},
{custID:"10001",amount:250,status:"A"},
{custID:"10002",amount:200,status:"A"},
{custID:"10001",amount: 300, status:"D"}]);
1.创建map的函数--过滤数据查询
var map = function()
{
emit (this.custID, this.amount);
}
2.创建Reduce函数--计算总数
var reduce = function(key, values)
{
return Array.sum(values) ;
}
3.使用上面创建的函数
db.orders.mapReduce(map, reduce,
{
out: "order_totals",query:{status:"A"}
});
4.查询
db.order_totals.find()
5.结果
{ "_id" : "10001", "value" : 750 }
{ "_id" : "10002", "value" : 200 }
Recipe 3-7. Single-Purpose Aggregation Operations(单一整合操作)
准备数据
db.orders.insertMany([
{custID:"10001",amount:500,status:"A"},
{custID:"10001",amount:250,status:"A"},
{custID:"10002",amount:200,status:"A"},
{custID:"10001",amount: 300, status:"D"}]);
1.排除重复custID
db.orders.distinct("custID")
Recipe 3-8. Matching SQL Aggregation to MongoDB Aggregation Operations(SQL与Mongodb的术语匹配)
SQL Term MongoDB Operator
Where $match
groUp BY $group
haVing $match
SeleCt $project
orDer BY $sort
liMit $limit
SUM $sum
CoUnt $sum
Join $lookup