Mongodb 是否将总价存储在文档中或通过聚合解决?

Mongodb 是否将总价存储在文档中或通过聚合解决?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我得到了一个用品集合,其中包含以下设计的文档: { _id: ObjectId("532807bdf09ae6e7464191c1"), supplier: { $ref: "suppliers", $id: ObjectId("5328078cf09ae6e7464191c0") }, state: { created: ISODate("2013-12-10T00:00:00Z"), shippe

我得到了一个用品集合,其中包含以下设计的文档:

{
    _id: ObjectId("532807bdf09ae6e7464191c1"),
    supplier: {
        $ref: "suppliers",
        $id: ObjectId("5328078cf09ae6e7464191c0")
    },
    state: {
        created: ISODate("2013-12-10T00:00:00Z"),
        shipped: ISODate("2013-12-11T00:00:00Z"),
        cleared: ISODate("2013-12-11T00:00:00Z")
    },
    materials: [
        {
            material: {
                $ref: "materials",
                $id: ObjectId("53280782f09ae6e7464191b9")
            },
            quantity: 1,
            price: 4.8
        },
        {
            material: {
                $ref: "materials",
                $id: ObjectId("53280782f09ae6e7464191ba")
            },
            quantity: 1,
            price: 3.5
        },
        {
            material: {
                $ref: "materials",
                $id: ObjectId("53280782f09ae6e7464191bb")
            },
            quantity: 1,
            price: 4.1
        },
        {
            material: {
                $ref: "materials",
                $id: ObjectId("53280782f09ae6e7464191bc")
            },
            quantity: 1,
            price: 4.3
        },
        {
            material: {
                $ref: "materials",
                $id: ObjectId("53280782f09ae6e7464191bd")
            },
            quantity: 1,
            price: 3.6
        },
        {
            material: {
                $ref: "materials",
                $id: ObjectId("53280782f09ae6e7464191be")
            },
            quantity: 1,
            price: 3.15
        },
        {
            material: {
                $ref: "materials",
                $id: ObjectId("53280782f09ae6e7464191bf")
            },
            quantity: 1,
            price: 5
        }
    ]
}
在业务逻辑中,我有时想知道单个供应品文档的总价

这可以通过聚合实现:


然而,这样做是明智的,还是应该只在文档中添加一个“总计”字段?

尽管我是聪明事物的粉丝,聚合是一件非常好和聪明的事情。可能会问自己,对于一个文档,那么存储一个文档的总成本是多少?那么,你有没有可能把所有的数据都放在一起计算呢?聚合是一件聪明的事情,但在这种情况下更好吗?你可能是最好的答案。@NeilLunn两者都有好处和坏处。使用聚合的主要好处是,我们可以更新价格,而无需关心总资产,但这种情况并不经常发生,所以我想您使用额外字段是正确的!那很好。您的问题可能会从如何维护数据的附加信息中受益。就目前的情况而言,目前的问题似乎很容易接受意见。如果你认为有什么事情需要解决。然后通知我们,然后你很可能会得到建议以外的东西。只是想公平地告诉大家,目前这并不符合“主题”。如果您可以将其更改为这样做,请执行。这里有讨论的地方。
db.supplies.aggregate({
  $unwind: "$materials" // go through material array
},
{
  $project: {
    "total": {
      // calculate price of each item (1.19 is vat)
      $multiply: ["$materials.quantity", "$materials.price", 1.19]
    }
  }
},
{
  $group: {
    "_id": "$_id",
    "total": {
      // sum all items together
      $sum: "$total"
    }
  }
});