Запрос MongoDB и Mongoose возвращает нулевое значение для агрегата $ или поиска с несоответствующим полем, возвращает отдельные поиски или с пропущенным неопределенным значением - PullRequest
0 голосов
/ 25 октября 2018

Меня немного смущает поведение, которое я вижу в запросе Mongoose / MongoDB, так как кажется, что оператор $or обрабатывается как $and

У меня есть следующееДокумент коллекции, к которому я обращаюсь:

{
    "_id": {
        "$oid": "5bd0d709ff8eef5d5325090f"
    },
    "audienceTrackingID": "3e66c213-fe0b-4096-a99c-558a6c349b4b",
    "mainframeTrackingID": null,
    "partner1TrackingID": "85c5f168-08da-44d3-bbef-fbb3b8392ded",
    "__v": 0,
    "contentFocus": "Cooking",
    "ipRange": [
        "29.142.127.151"
    ]
}

С помощью следующего запроса:

console.log(req.headers['x-original-ip']) // '29.142.127.151'
console.log(req.headers['x-audience-tracking-id']) // undefined
console.log(req.headers['x-partner-1-tracking-id']) // "85c5f168-08da-44d3-bbef-fbb3b8392ded"

const clientMatch = await Client.findOne({
    $or: [{ 
        ipRange: req.headers['x-original-ip'],  
        audienceTrackingID: req.headers['x-audience-tracking-id'],
        partner1TrackingID: req.headers['x-partner-1-tracking-id'],
    }]
})

console.log(clientMatch) // null

Немного озадачивает, как запрос отдельных полей, так и удаление моего запроса, где находится параметрundefined в фактическом запросе (req.headers['x-audience-tracking-id']) даст результаты (что заставляет меня задуматься, почему это действует как AND и дает мне нулевое значение, когда одно поле запроса не работает ???)

// ALL QUERIES HIT AND RETURN A MATCH:

const tryThis = await Client.findOne({partner1TrackingID: req.headers['x-partner-1-tracking-id']})
const ipMatch = await Client.findOne({ipRange: req.headers['x-original-ip']})
const clientMatch = await Client.findOne({
    $or: [{ 
        ipRange: req.headers['x-original-ip'],  
        partner1TrackingID: req.headers['x-partner-1-tracking-id'],
    }]
})

Это не даетсмысл для меня.Зачем мне нужно опускать поле, которое может не совпадать с оператором $ или, чтобы получить совпадение, когда другие поля совпадают?

1 Ответ

0 голосов
/ 25 октября 2018

Когда вы пытаетесь выполнить запрос, вы на самом деле получаете:

query failed: cannot compare to undefined

См. это здесь

Это одна из причин, по которой вы не получаете результатов, другая заключается в том, чтоВаш $or запрос неверен.Вам необходимо разделить элементы or-ed на отдельные объекты для MongoDB:

Поэтому измените свой код на этот:

const clientMatch = await Client.findOne({
    $or: [
        {ipRange: req.headers['x-original-ip']},  
        {audienceTrackingID: req.headers['x-audience-tracking-id'] || ''},
        {partner1TrackingID: req.headers['x-partner-1-tracking-id']},
    ]
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...