$ Filter с mongoDB для документов внутри массива - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь создать запрос для извлечения информации из моего mongoDB, но мне нужно отфильтровать результаты и получить только соответствующее значение.

Так я пытался до сих пор. Мне нужно сопоставить costHouse._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. Мне нужно получить каждое значение из costHouse, но только с пропущенным «идентификатором» необходимо сопоставить с costHouse.ID

MongoDB Schema

После того, как результат I нужно использовать их здесь, в моих рулях

<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>

Ответы [ 2 ]

1 голос
/ 29 января 2020

Попробуйте следующие варианты:

1) Использование $ фильтра-агрегации :

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
        });
    })
})
0 голосов
/ 29 января 2020

Исходя из того, что вы сказали, вы пытаетесь добиться того, что вам предоставляет оператор $ elemMatch .

Попробуйте этот код и оставьте комментарий ниже, если он помогло:

.
. // All the other stuff
.
expensesHouse: {
    $elemMatch: {
        _id: req.params.id // or ObjectId(req.params.id)
    }
}
...