Мангуст - поиск объекта по полю населенного объекта - PullRequest
0 голосов
/ 02 мая 2018

У меня есть схема мангуста:

var ClientRentalSchema = new mongoose.Schema({
    carId: { 
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Car'
    },
    userId: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    },
    startDate: Date,
    endDate: Date,
    payment: Number,
    status: { type: String, default: "Oczekujące" },
    discount: { type: Number, default: 0 }
});

Теперь я пытаюсь найти объект по номеру идентификационной карты пользователя. Во-первых, ближе всего я получил по этому коду:

Rental.find()
         .populate('userId', 'idNumber')
         .findOne({'userId.idNumber': 'XYZ 987654'})
        .exec( (err, values) => {
            if(err) return err;
            res.json(values);
    })

Это дает ноль. Это образец объекта аренды после заполнения:

{"status":"Aktywne",
"discount":0.2,
"_id":"5ae06b49abafb90e20359892",
"carId":"5ad6186ebd371940e4131f71",
"userId":{"_id":"5ad8e077a59b7d58fc2384bd",
    "idNumber":"ABC 123456"},
"startDate":"2018-04-26T09:11:00.000Z",
"endDate":"2018-04-29T09:11:00.000Z",
"payment":237.6,
"__v":0}

Каким будет правильный способ поиска аренды по номеру удостоверения пользователя?

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

К сожалению, кажется, что mongoose немного усложняет ситуацию, так как не поддерживает JOINS. Я считаю, что нам нужны два запроса:

  1. Получите идентификаторы пользователей, запросив пользователей по их «номеру карты»
  2. Получите аренду, где назначены вышеуказанные идентификаторы пользователей

Это может выглядеть так:

Users.findOne({'userId': 'XYZ 987654'}), (err, user) => {
    if(err) return err;

    if(user) {
      Rental
        .findOne({'userId': user._id}), (err, rental) => {
          if(err) return err;
          res.json(rental);
      });
    }
  });

И это может быть легко переключено для принятия нескольких пользовательских «номеров карт» и возврата нескольких арендных плат, используя find() вместо findOne().

0 голосов
/ 02 мая 2018

Ваш вопрос выглядит так, как будто вы пытаетесь запросить один документ, выполнив поиск по полю userId.idNumber. Если это все, что вам нужно сделать, то вам нужно просто выполнить поиск, используя только findOne () с конкретным полем, которому вы хотите соответствовать.

Rental.findOne({'userId.idNumber': 'XYZ 987654'}, function(err, rentalDoc) {
        if(err) return err;
        res.json(values);
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...