2017-02-09 4 views
1

Я создаю поисковый запрос, где он найдет объект базы данных по его идентификатору, даже когда пользователь печатает.Mongoose: Как найтиById, когда запрос не завершен

ordersRouter.route('/searchorder/:term') 
    .get(function(req, res){ 
     term = req.params.term; 
     console.log(term); 
     Orders.findById(term) 
      .populate({ path: 'userPurchased products.product', select: '-username -password' }) 
      .exec(function(err, orders){ 
       if (err) throw err; 

       res.json([orders]); 
      }); 
    }); 

Проблема здесь состоит в том, что, когда term не точно такой же, как ID, он не будет возвращать ничего. Как я могу вернуть идентификаторы с частичным term?

EDIT: Моя модель заказа Схема

var orderSchema = new Schema({ 
    orderId: { type: String }, 
    userPurchased: { type: Schema.Types.ObjectId, ref: 'users' }, 
    products: [ 
     { 
      product: { type: Schema.Types.ObjectId, ref: 'products' }, 
      size: { type: String, required: true }, 
      quantity: { type: Number, required: true }, 
      subTotal: { type: Number, required: true } 
     } 
    ], 
    totalQuantity: { type: Number }, 
    totalPrice: { type: Number }, 
    modeOfPayment: { type: String }, 
    shippingAd: { type: String }, 
    refNumber: { type: String }, 
    isDone: { type: Boolean, default: false }, 
    orderStatus: { type: String, default: 'Pending' }, 
    dateOrdered: { type: Date, default: Date.now() }, 
    fromNow: { type: String } 
}); 
+0

findById ожидает, что ID (тип ObjectID не является ни строкой, ни целым, ни что-либо еще) в качестве параметра, поэтому почему вы даже пытаетесь дать ему что-то еще? Я не думаю, что вы действительно можете это сделать. Лучший способ, который я могу придумать, - дать каждому заказному идентификатору типа String, который вы могли бы использовать, чтобы найти только часть идентификатора. – Molda

+0

, поэтому я могу использовать find, даже если это лишь частичный текст, когда я делаю свой ID строкой? –

+0

Как я могу это сделать? Просто обычный запрос на поиск? –

ответ

1

Вы можете запустить свой запрос с использованием регулярных выражений т.е. создать объект регулярного выражения из строки с помощью RegExp конструктор затем запустить запрос как:

ordersRouter.route('/searchorder/:term') 
    .get(function(req, res){ 
     term = req.params.term; 
     console.log(term); 

     Orders.find({'orderId': new RegExp(term)}) 
      .populate({ 
       path: 'userPurchased products.product', 
       select: '-username -password' 
      }) 
      .exec(function(err, orders){ 
       if (err) throw err; 

       res.json(orders); 
      }); 
    }); 
+0

может ли это вернуть массив объектов? Я читал, что если я использую регулярное выражение, он вернет только один элемент. –

+0

Да, 'find(). Exe()' вернет массив и нет, regex вернет документы, соответствующие данному шаблону, например. если в вашей коллекции 'orders' находятся следующие документы' [{orderId: 'test1'}, {orderId: 'test2'}, {orderId: 'test3'}] ', запрос' Orders.find ({'orderId ': new RegExp (' test ')}) 'вернет все документы, поскольку регулярное выражение'/test/'соответствует трем документам. – chridam

+0

Могу ли я также спросить, удалили ли поисковый запрос и нет значения в 'term', как я могу снова отобразить все элементы? –

Смежные вопросы