Меня немного смущает поведение, которое я вижу в запросе 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'],
}]
})
Это не даетсмысл для меня.Зачем мне нужно опускать поле, которое может не совпадать с оператором $ или, чтобы получить совпадение, когда другие поля совпадают?