mongoDB聚合&;划分两个字段

mongoDB聚合&;划分两个字段,mongodb,mongodb-query,aggregation-framework,handlebars.js,Mongodb,Mongodb Query,Aggregation Framework,Handlebars.js,我有以下MongoDB模式 我想要的是:把我每一笔费用的价格除以会员人数 i、 e: 下面的示例中,我有一个price=60的费用,并且存在2个成员,因此我需要price/members的值 我有以下方法来获得我的价值观 router.get("/dashboard", ensureAuthenticated, (req, res) => { House.aggregate([ { $match: { members: req.user.id } },

我有以下MongoDB模式

我想要的是:把我每一笔费用的价格除以会员人数

i、 e:

下面的示例中,我有一个price=60的费用,并且存在2个成员,因此我需要price/members的值

我有以下方法来获得我的价值观

router.get("/dashboard", ensureAuthenticated, (req, res) => {
  House.aggregate([
    {
      $match: { members: req.user.id }
    },
    {
      $unwind: "$expensesHouse"
    },
    {
      $match: { "expensesHouse.status": "Public" }
    }
  ]).then(house => {
    console.log(house);
    res.render("houses/dashboard", {
      house: house
    });
  });
});
我知道我可以做我需要的事情,但我不知道如何用它们检索价值。。在那之后,它应该用我的把手来渲染

<tbody>
                            {{#each house}}
                            <tr>
                                <td></td>
                                <td>{{name}}</td>
                                <td>{{expensesHouse.expenseType}}</td>
                                <td>{{expensesHouse.price}}€</td>
                                <td>{{VALUE.DIVIDED}}</td>


                                <td>{{formatDate date 'MMMM Do YYYY'}}</td>
                                <td>
                                    <a href="/houses/showExpense/{{expensesHouse.id}}" id="detailsExpense"
                                        class="btn btn-outline-light mb-3"><i class="fas fa-eye mr-2"></i>Details
                                    </a>
                                <td>
                                    <a href="/houses/editExpense/{{expensesHouse.id}}" id="editExpense"
                                        class="btn btn-outline-light mb-3"><i class="fas fa-edit mr-2"></i>Edit
                                </td>
                            </tr>
                            {{else}}
                            <p>No expenses</p>
                            {{/each}}
                        </tbody>

非常感谢您的帮助

您可以尝试以下查询:

House.aggregate([
    { $match: { members: 'someObjectIDInString' } },
    {
        $addFields: {
            expensesHouse: { // expensesHouse array will be replaced by objects resulted by map operator
                $map:
                {
                    /** $filter only retains objects in array which satisfy condition */
                    input: { $filter: { input: '$expensesHouse', as: 'each', cond: { $eq: ['$$each.status', 'Public'] } } },
                    as: "each",
                    /** will add a new field dividedValue to existing object */
                    in: { $mergeObjects: ['$$each', { dividedValue: { $divide: ["$$each.price", { $size: '$members' }] } }] }
                }
            }
        }
    }])
收集数据:

  name: {
    type: String,
    required: true
  },
  description: {
    type: String,
    required: true
  },
  address: {
    type: String,
    required: false
  },
  userType: {
    type: String,
    required: true
  },
  user: {
    type: String,
    required: true
  },
  userID: {
    type: String,
    required: true
  },
  members: [
    {
      type: String
    }
  ],
  expensesHouse: [
    {
      expenseType: {
        type: String
      },
      description: {
        type: String,
        required: true
      },
      price: {
        type: Number,
        require: true
      },
      status: {
        type: String,
        default: "public"
      },
      payAt: {
        type: Date
      },
      userID: {
        type: String,
        require: false
      },
      date: {
        type: Date,
        default: Date.now
      }
    }
  ],
  date: {
    type: Date,
    default: Date.now
  }
});
/* 1 */
{
    "_id" : ObjectId("5e2f6045d02e05b694913e10"),
    "members" : [ 
        "someObjectIDInString", 
        "someObjectIDInString2"
    ],
    "expensesHouse" : [ 
        {
            "status" : "Public",
            "price" : 60
        }, 
        {
            "status" : "Private",
            "price" : 40
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5e2f6057d02e05b694913fb4"),
    "members" : [ 
        "someObjectIDInString", 
        "someObjectIDInString2", 
        "someObjectIDInString2"
    ],
    "expensesHouse" : [ 
        {
            "status" : "Public",
            "price" : 120
        }, 
        {
            "status" : "Public",
            "price" : 200
        }
    ]
}
/* 1 */
{
    "_id" : ObjectId("5e2f6045d02e05b694913e10"),
    "members" : [ 
        "someObjectIDInString", 
        "someObjectIDInString2"
    ],
    "expensesHouse" : [ 
        {
            "status" : "Public",
            "price" : 60,
            "dividedValue" : 30.0
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5e2f6057d02e05b694913fb4"),
    "members" : [ 
        "someObjectIDInString", 
        "someObjectIDInString2", 
        "someObjectIDInString2"
    ],
    "expensesHouse" : [ 
        {
            "status" : "Public",
            "price" : 120,
            "dividedValue" : 40.0
        }, 
        {
            "status" : "Public",
            "price" : 200,
            "dividedValue" : 66.6666666666667
        }
    ]
}
结果:

  name: {
    type: String,
    required: true
  },
  description: {
    type: String,
    required: true
  },
  address: {
    type: String,
    required: false
  },
  userType: {
    type: String,
    required: true
  },
  user: {
    type: String,
    required: true
  },
  userID: {
    type: String,
    required: true
  },
  members: [
    {
      type: String
    }
  ],
  expensesHouse: [
    {
      expenseType: {
        type: String
      },
      description: {
        type: String,
        required: true
      },
      price: {
        type: Number,
        require: true
      },
      status: {
        type: String,
        default: "public"
      },
      payAt: {
        type: Date
      },
      userID: {
        type: String,
        require: false
      },
      date: {
        type: Date,
        default: Date.now
      }
    }
  ],
  date: {
    type: Date,
    default: Date.now
  }
});
/* 1 */
{
    "_id" : ObjectId("5e2f6045d02e05b694913e10"),
    "members" : [ 
        "someObjectIDInString", 
        "someObjectIDInString2"
    ],
    "expensesHouse" : [ 
        {
            "status" : "Public",
            "price" : 60
        }, 
        {
            "status" : "Private",
            "price" : 40
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5e2f6057d02e05b694913fb4"),
    "members" : [ 
        "someObjectIDInString", 
        "someObjectIDInString2", 
        "someObjectIDInString2"
    ],
    "expensesHouse" : [ 
        {
            "status" : "Public",
            "price" : 120
        }, 
        {
            "status" : "Public",
            "price" : 200
        }
    ]
}
/* 1 */
{
    "_id" : ObjectId("5e2f6045d02e05b694913e10"),
    "members" : [ 
        "someObjectIDInString", 
        "someObjectIDInString2"
    ],
    "expensesHouse" : [ 
        {
            "status" : "Public",
            "price" : 60,
            "dividedValue" : 30.0
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5e2f6057d02e05b694913fb4"),
    "members" : [ 
        "someObjectIDInString", 
        "someObjectIDInString2", 
        "someObjectIDInString2"
    ],
    "expensesHouse" : [ 
        {
            "status" : "Public",
            "price" : 120,
            "dividedValue" : 40.0
        }, 
        {
            "status" : "Public",
            "price" : 200,
            "dividedValue" : 66.6666666666667
        }
    ]
}

您只需要mongoDB查询还是需要代码方面的帮助?另外,请提供文本格式的mongo文档!!我只是需要mongoDB查询的帮助来划分这些值。在原始帖子中添加了mongo文档。令人惊讶的家伙!!你摇滚:)真管用!!只是一件小事。。我们能从除法值中去掉一些小数吗?i、 e:你有'66.6666667'你能把这个切到66.6吗?@CarlosOrelhas:如果你同意
66.7
那么你可以这样做
dividedValue:{$round:[{$divide:[“$$each.price”,{$size:'$members'},1]}
非常感谢!!非常适合我!