Meteor Collection:在数组中查找元素

Der*_*nko 4 mongodb meteor

我没有使用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)

很好,但是当我想获得每个产品的统计数据时,运营产品使用的是什么.如何搜索我的操作并查找该产品的每项操作?

或者这种方式不好?真正的专业人士如何在现实世界中做到这一点?

Syl*_*oux 7

如果我理解得很好,这里有一个存储在你的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)