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"
}
}
});