$Filter with mongoDB 数组中的文档
$Filter with mongoDB on documents inside array
我正在尝试构建查询以从我的 mongoDB 中获取信息,但我需要过滤结果并仅获取相应的值。
这是我迄今为止尝试过的方法。我需要将 expensesHouse._id 与我将在 link.
中传递的 ID 相匹配
router.get("/showExpense/:id", ensureAuthenticated, (req, res) => {
House.aggregate([
{
expensesHouse: {
$filter: {
input: "$expensesHouse",
as: "each",
cond: { $eq: ["$$each._id", req.params.id] }
}
}
}
]).then(house => {
console.log(house);
res.render("houses/showExpense", {
house: house
});
});
以下屏幕是 mongodb 架构。
我需要从 expensesHouse 获取每个值,但只有我传递的 'id' 需要与 expensesHouse.ID
匹配
结果出来后,我需要在车把中使用它们
<form>
{{#each house}}
{{#each expensesHouse}}
<div class="form-group">
<label for="expenseType" class="text-dark">Expense Type</label>
<input type="text" class="form-control" name="expenseType" value="{{expenseType}}" disabled>
</div>
<div class="form-group">
<label for="description" class="text-dark">Description</label>
<input type="text" class="form-control" name="description" value="{{description}}" disabled>
</div>
<div class="form-group">
<label for="price" class="text-dark">Price</label>
<input type="text" class="form-control" name="price" value="{{price}}" disabled>
</div>
<div class="form-group">
<label for="status" class="text-dark">Price</label>
<input type="text" class="form-control" name="status" value="{{status}}" disabled>
</div>
{{/each}}
{{/each}}
</form>
根据您所说的,您正在尝试实现运算符 $elemMatch 为您提供的功能。
试试这个代码,如果有帮助请在下方评论:
.
. // All the other stuff
.
expensesHouse: {
$elemMatch: {
_id: req.params.id // or ObjectId(req.params.id)
}
}
试试这些选项:
1) $filter-aggregation 的使用:
var mongoose = require('mongoose');
router.get("/showExpense/:id", ensureAuthenticated, (req, res) => {
var id = mongoose.Types.ObjectId(req.params.id);
House.aggregate([
{
$addFields:
{
expensesHouse: {
$filter: {
input: "$expensesHouse",
as: "each",
cond: { $eq: ["$$each._id", id] }
}
}
}
}
]).lean().then(house => {
console.log(house);
res.render("houses/showExpense", {
house: house
});
})
})
2) $elemMatch-projection 的使用:
var mongoose = require('mongoose');
router.get("/showExpense/:id", ensureAuthenticated, (req, res) => {
var id = mongoose.Types.ObjectId(req.params.id);
House.find({ 'expensesHouse._id': id }, {
members: 1, name: 1, description: 1, address: 1,
type: 1, user: 1, userID: 1, userType: 1, expensesHouse: { $elemMatch: { _id: id } }, date: 1
}).then(house => {
console.log(house);
res.render("houses/showExpense", {
house: house
});
})
})
我正在尝试构建查询以从我的 mongoDB 中获取信息,但我需要过滤结果并仅获取相应的值。
这是我迄今为止尝试过的方法。我需要将 expensesHouse._id 与我将在 link.
中传递的 ID 相匹配router.get("/showExpense/:id", ensureAuthenticated, (req, res) => {
House.aggregate([
{
expensesHouse: {
$filter: {
input: "$expensesHouse",
as: "each",
cond: { $eq: ["$$each._id", req.params.id] }
}
}
}
]).then(house => {
console.log(house);
res.render("houses/showExpense", {
house: house
});
});
以下屏幕是 mongodb 架构。 我需要从 expensesHouse 获取每个值,但只有我传递的 'id' 需要与 expensesHouse.ID
匹配结果出来后,我需要在车把中使用它们
<form>
{{#each house}}
{{#each expensesHouse}}
<div class="form-group">
<label for="expenseType" class="text-dark">Expense Type</label>
<input type="text" class="form-control" name="expenseType" value="{{expenseType}}" disabled>
</div>
<div class="form-group">
<label for="description" class="text-dark">Description</label>
<input type="text" class="form-control" name="description" value="{{description}}" disabled>
</div>
<div class="form-group">
<label for="price" class="text-dark">Price</label>
<input type="text" class="form-control" name="price" value="{{price}}" disabled>
</div>
<div class="form-group">
<label for="status" class="text-dark">Price</label>
<input type="text" class="form-control" name="status" value="{{status}}" disabled>
</div>
{{/each}}
{{/each}}
</form>
根据您所说的,您正在尝试实现运算符 $elemMatch 为您提供的功能。
试试这个代码,如果有帮助请在下方评论:
.
. // All the other stuff
.
expensesHouse: {
$elemMatch: {
_id: req.params.id // or ObjectId(req.params.id)
}
}
试试这些选项:
1) $filter-aggregation 的使用:
var mongoose = require('mongoose');
router.get("/showExpense/:id", ensureAuthenticated, (req, res) => {
var id = mongoose.Types.ObjectId(req.params.id);
House.aggregate([
{
$addFields:
{
expensesHouse: {
$filter: {
input: "$expensesHouse",
as: "each",
cond: { $eq: ["$$each._id", id] }
}
}
}
}
]).lean().then(house => {
console.log(house);
res.render("houses/showExpense", {
house: house
});
})
})
2) $elemMatch-projection 的使用:
var mongoose = require('mongoose');
router.get("/showExpense/:id", ensureAuthenticated, (req, res) => {
var id = mongoose.Types.ObjectId(req.params.id);
House.find({ 'expensesHouse._id': id }, {
members: 1, name: 1, description: 1, address: 1,
type: 1, user: 1, userID: 1, userType: 1, expensesHouse: { $elemMatch: { _id: id } }, date: 1
}).then(house => {
console.log(house);
res.render("houses/showExpense", {
house: house
});
})
})