Найти соответствующий документ на основе параметров, хранящихся в документе - PullRequest
0 голосов
/ 05 февраля 2020

Я столкнулся с проблемой при разработке небольшого рекламного сервера с параметрами таргетинга.

Учитывая, что у нас есть коллекция кампаний со следующими параметрами в модели mon goose:

new MongoOse.Schema({
image: String,
filters: [new MongoOse.Schema({
                uid: String,
                type: {
                    type: String,
                    enum: ['curr_avg', 'target_avg', 'subject_id']
                },
                comperator: {type: String, enum: ['lte', 'gte', 'bw', 'eq']},
                subject_id: ObjectId,
                value_0: Number,
                value_1: Number
            })]
})

Теперь я хочу найти все кампании, в которых значения пользователя совпадают с фильтрами кампании. пользовательская схема определяется следующим образом:

new MongoOse.Schema({
username: String,
subject: ObjectId,
curr_avg: Number,
target_avg: Number
})

Есть идеи о том, как выполнить запрос collection.find(), чтобы получить соответствующие кампании для пользователя?

Мой первый черновик следующее:

{$or: [
                                {
                                    filters: // todo: find matching documents
                                },
                                {
                                    filters: {
                                        $size: 0 // or no filters specified
                                    }
                                }, {
                                    filters: null
                                }, {
                                    filters: {
                                        $exists: false // or filters not exisiting
                                    }
                                }
                            ]}

1 Ответ

0 голосов
/ 12 февраля 2020

У вас есть уровень абстракции, который, я думаю, вам не нужен. Почему вы создаете атрибут фильтров? С MongoDB атрибуты являются фильтрами ... удаляют этот слой и просто используют Campaign.find({'field': 'value', 'field2': 'value2'});

Также - использование типа в качестве имени атрибута, вероятно, не рекомендуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...