mongoDB聚合&;划分两个字段
我有以下MongoDB模式 我想要的是:把我每一笔费用的价格除以会员人数 i、 e: 下面的示例中,我有一个price=60的费用,并且存在2个成员,因此我需要price/members的值 我有以下方法来获得我的价值观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 } },
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]}
非常感谢!!非常适合我!