Фильтровать массив документов для возврата значений, соответствующих запросу Mongodb - PullRequest
0 голосов
/ 29 января 2019

У меня есть следующее приложение.Требовалось (FreeCodeCamp) возвращать коллекцию упражнений по датам и период времени (длительность) с _id и запросом на совпадение имени пользователя в URL.

Я пытался выполнить следующие действия:

  1. Использование агрегата с с $match для поиска _id в запросе.
  2. Размотка массива данных с помощью $unwind.

Url:

http://localhost:3000/api/exercise/log21?id=eUyhCDgMB&start=31 December 2018&end=22 December 2018&limit=2
let iniate = new Date(req.query.start);
let one = moment(iniate).format("YYYY-MM-DDT00:00:00.000") + "Z";
let date1 = new Date(one);
console.log(date1);
console.log(typeof(date1));
let iniate1 = new Date(req.query.end);
let two = moment(iniate1).format("YYYY-MM-DDT00:00:00.000") + "Z";
let date2 = new Date(two);
console.log(date2)
console.log(typeof(date2))

app.get('/api/exercise/log21', (req, res) => {
  array.aggregate([{
    $match: {
      '_id': req.query.id
    }
  }, {
    $unwind: "$data"
  }]).then(doc => {
    res.send(doc)
  }).catch(e => {
    res.send(e);
  })
})

JSON вернул

[{
    "_id": "eUyhCDgMB",
    "username": "Donald Duck",
    "data": {
      "description": "walking",
      "duration": 2,
      "date": "2019-01-01T00:00:00.000Z"
    },
    "__v": 0
  },
  {
    "_id": "eUyhCDgMB",
    "username": "Donald Duck",
    "data": {
      "description": "Mountain Biking",
      "duration": 3,
      "date": "2019-01-01T00:00:00.000Z"
    },
    "__v": 0
  },
  {
    "_id": "eUyhCDgMB",
    "username": "Donald Duck",
    "data": {
      "description": "Reading",
      "duration": 3,
      "date": "2018-12-31T00:00:00.000Z"
    },
    "__v": 0
  }
]

Мне нужно отфильтровать все даты, не соответствующие запросу в URL, и вернуть даты, соответствующие запросу, с именем пользователя, идентификатором, описанием, продолжительностью и датами сопоставления для запроса.Показано в моем коде localhost 3000. Чтобы получить запрос даты от строки к объекту даты, я использую moment.js.Как показано в моем коде с переменными date1 и date2.

Я пытаюсь установить $gte равным date1 и $lte равным $end=date2 Если лимит установлен меньше возвращаемых датМне нужно вернуть количество дат, установленных в URL.Примерный предел = 2.Вернуть только два совпадающих значения даты.

1 Ответ

0 голосов
/ 01 февраля 2019

Я наконец-то нашел способ установить ограничение на соответствующую дату или даты документа.Я включаю следующий код.Я включаю следующий код.

app.get('/api/exercise/log',(req,res)=>{
 array.findById({_id:req.query.id},(err,data)=>{
		let iniate = new Date(req.query.start);
				 let one = moment(iniate).format("YYYY-MM-DDT00:00:00.000") + "Z";
				 let date1 = new Date(one);
				 console.log(date1);
				 console.log(typeof(date1));
	let iniate1 = new Date(req.query.end);
				 let two = moment(iniate1).format("YYYY-MM-DDT00:00:00.000") + "Z";
				 let date2 = new Date(two);
				 console.log(date2)
				 console.log(typeof(date2))	
  let myLength;
	   if(req.query.start === undefined && req.query.end === undefined && req.query.limit === undefined && req.query.id !== undefined){
		 myLength = data.data.length;
		array.aggregate([
    { $match: {_id: req.query.id}}]).then(data =>{
		res.send({count:myLength,data})
	})
	  }
	  else if(req.query.start !== undefined && req.query.end !== undefined && req.query.limit !== undefined && req.query.id !== undefined){
	  array.aggregate([
    { $match: {_id: req.query.id}},
    { $unwind: '$data'},{$match : {"$and" :  [{"data.date" :{$gte : date1} },
    {"data.date" :{"$lte" : date2}}]}}]).limit(Number(req.query.limit)).then(data =>{
		if(data.length >= Number(req.query.limit)){
		res.send(data)
		}else{
		return  res.send({error:"Document do not match limit requested"})
	  }
	})
	  }
	 })
})

Это, наконец, вернуло необходимые параметры проекта, которые были необходимы для завершения моего проекта для Free Code Camp.Используя следующую ссылку stackoverflow вопрос, как запросить данные внутри массива коллекции, используя mongoose

...