Как передать необязательный аргумент в Mongoose / MongoDb - PullRequest
0 голосов
/ 26 апреля 2020

У меня следующий запрос:

Documents.find({
    $and: [
      {
        user_id: {$nin: 
          myUserId
        }
      },
      { date: { $gte: dateMax, $lt: dateMin } },
      {documentTags: {$all: tags}}
    ],
  })

Я пытаюсь сделать часть запроса documentTags необязательной. Я попытался построить запрос следующим образом:

let tags = " ";
    if (req.body.tags) {
        tags = {videoTags: {$all: req.body.tags}};
    }

let query = {
        $and: [
          {
            user_id: {$nin: 
              myUserId
            }
          },
          { date: { $gte: dateMax, $lt: dateMin } },
          tags
        ],
      }

, а затем Document.find(query). Проблема не в том, как я изменяю теги (независимо от того, определены ли они как пробелы или нет). Я получаю различные ошибки, такие как $or/$and/$nor entries need to be full objects и TypeError: Cannot read property 'hasOwnProperty' of undefined.

Есть ли способ встроить необязательное требование в запрос? ?

Я попробовал вариант ниже, и запрос просто возвращает все, что соответствует другим полям. По какой-то причине он не фильтруется по тегам. Я console.log(queryArr) и console.log(query) получил следующее:

[
  { user_id: { '$nin': [Array] } },
  {
    date: {
      '$gte': 1985-01-01T00:00:00.000Z,
      '$lt': 2020-01-01T00:00:00.000Z
    }
  },
  push: { documentTags: { '$all': [Array] } }
]

console.log (query)

{
  '$and': [
    { user_id: [Object] },
    { date: [Object] },
    push: { documentTags: [Object] }
  ]
}

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Вы почти у цели. Вместо этого вы можете создать объект вне запроса и просто поместить созданный запрос в $and, когда закончите.

let queryArr = [
                 {
                    user_id: {$nin: myUserId}
                 },
                 { date: { $gte: dateMax, $lt: dateMin } }
               ];

    if (req.body.tags) {
        queryArr.push({videoTags: {$all: req.body.tags}});
    }

let query = {
        $and: queryArr
      }

Теперь вы можете управлять запросом, просто вставив объект в массив Array запроса.

0 голосов
/ 27 апреля 2020

Я понял, почему это не работает. Обычно, когда вы делаете myVar.push, создается key-value pair, например [1,2,3,push:value]. Это сработает, если вам нужно добавить пару kv в этом формате, но вам будет трудно использовать ее в запросе, подобном моему. Для меня оказалось правильным использовать concact, который appends массив с только что заданным значением, а не пару kv.

if (req.body.tags){
    queryArgs = queryArgs.concat({documentTags: {$all: tags}});
}
let query = {
    $and: queryArgs
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...