我没有使用NoSQL的经验.所以,我认为,如果我只是试着询问代码,我的问题可能是不正确的.相反,让我解释一下我的问题.
假设我有电子商店.我有目录
Catalogs = new Mongo.Collection('catalogs);
Run Code Online (Sandbox Code Playgroud)
和目录中的产品
Products = new Mongo.Collection('products');
Run Code Online (Sandbox Code Playgroud)
然后,人们将订单添加到临时收集
Order = new Mongo.Collection();
Run Code Online (Sandbox Code Playgroud)
然后,人们提交他们的评论,电话等,并订购.我将它保存到集合操作:
Operations.insert({
phone: "phone",
comment: "comment",
etc: "etc"
savedOrder: Order //<- Array, right? Or Object will be better?
});
Run Code Online (Sandbox Code Playgroud)
很好,但是当我想获得每个产品的统计数据时,运营产品使用的是什么.如何搜索我的操作并查找该产品的每项操作?
或者这种方式不好?真正的专业人士如何在现实世界中做到这一点?
如果我理解得很好,这里有一个存储在你的Operation集合中的示例文档:
{
clientRef: "john-001",
phone: "12345678",
other: "etc.",
savedOrder: {
"someMetadataAboutOrder": "...",
"lines" : [
{ qty: 1, itemRef: "XYZ001", unitPriceInCts: 1050, desc: "USB Pen Drive 8G" },
{ qty: 1, itemRef: "ABC002", unitPriceInCts: 19995, desc: "Entry level motherboard" },
]
}
},
{
clientRef: "paul-002",
phone: null,
other: "etc.",
savedOrder: {
"someMetadataAboutOrder": "...",
"lines" : [
{ qty: 3, itemRef: "XYZ001", unitPriceInCts: 950, desc: "USB Pen Drive 8G" },
]
}
},
Run Code Online (Sandbox Code Playgroud)
鉴于此,要查找具有项目引用的所有操作,XYZ001您只需查询:
> db.operations.find({"savedOrder.lines.itemRef":"XYZ001"})
Run Code Online (Sandbox Code Playgroud)
这将返回整个文档.如果您只对客户端引用(和操作_id)感兴趣,则将使用投影作为额外参数find:
> db.operations.find({"savedOrder.lines.itemRef":"XYZ001"}, {"clientRef": 1})
{ "_id" : ObjectId("556f07b5d5f2fb3f94b8c179"), "clientRef" : "john-001" }
{ "_id" : ObjectId("556f07b5d5f2fb3f94b8c17a"), "clientRef" : "paul-002" }
Run Code Online (Sandbox Code Playgroud)
如果需要执行多文档(包括多嵌入文档)操作,则应该查看聚合框架:
例如,要计算订单总数:
> db.operations.aggregate([
{$match: { "_id" : ObjectId("556f07b5d5f2fb3f94b8c179") }},
{$unwind: "$savedOrder.lines" },
{$group: { _id: "$_id",
total: {$sum: {$multiply: ["$savedOrder.lines.qty",
"$savedOrder.lines.unitPriceInCts"]}}
}}
])
{ "_id" : ObjectId("556f07b5d5f2fb3f94b8c179"), "total" : 21045 }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6463 次 |
| 最近记录: |