Пн goose: умышленно пытается вернуть дубликаты документов и получить только один - PullRequest
0 голосов
/ 29 мая 2020

После нескольких дней рыскания по сети и ТАК я не могу найти решение своей проблемы. У меня есть схема типа mon go фотогалереи, которая хранит кучу информации об изображении, такую ​​как URL-адрес, имя, описание, а также массив идентификаторов, которые являются идентификаторами параметров размера, хранящихся в их собственной коллекции. Одно изображение может иметь несколько вариантов размера, например, бумажный принт 8x12 или алюминиевый принт 16x24 с разными ценами, связанными с каждым. Когда пользователь выбирает изображение и кладет его в корзину, идентификатор изображения сохраняется, а идентификатор параметра размера сохраняется для каждого выбранного изображения.

Проблема, с которой я сталкиваюсь, заключается в том, что когда тележка отправляется в кассу, а код на стороне сервера получает идентификатор изображения и связанные идентификаторы параметра размера, я не могу заставить mongodb возвращать правильные данные, потому что он продолжает пытаться прополоть удалить дубликаты и вернуть только один документ. Итак, если кто-то выберет два изображения, у них будет два уникальных идентификатора, но если они выберут оба как бумажные отпечатки 8x12, значения идентификаторов этих параметров размера будут одинаковыми, и когда я скажу mon goose, чтобы найти значение идентификатора , поэтому я могу получить цену в базе данных, возвращается только одно значение. Мне нужно вернуть оба изображения, даже если они одинаковы. Если кто-то выберет 3 изображения, первое - 8x12, второе - 10x20, а третье - также 8x12, то вернется только 2 цены. Есть ли способ сказать mon goose, чтобы он предоставил мне все совпадающие данные, даже если это дубликат? Я пробовал несколько вещей, и каждый подход работает примерно на полпути, а затем терпит неудачу, потому что я не могу понять, как заставить mon go просто вернуть все согласованные документы.

Вот моя схема записи фотографий для одного изображения

 var photoSchema = new mongoose.Schema({

        gallery:        String,                             // name of gallery to add image to
        active:         Number,                             // 0 inactive - 1 active
        index:          Number,                             // for position ordering image on gallery page
        name:           String,                             // artistic name of image
        description:    String,                             // a little info about the image
        url:            [{ main: String, mainHd: String, thumb: String, thumbSm: String }], // Url of images
        tags:           [{ tag:  String, score: Number }],
        badge:          [{ url:  String,  info: String }],      // to add award images and a little note in the gallery sections
        sizeOptions:    [ {type: mongoose.Schema.Types.ObjectId, ref: 'Option'}],
        created:        { type: Date, default: Date.now }   
    });

    module.exports = mongoose.model("Photo", photoSchema);

Вот моя схема опций размера, которая содержит десятки потенциальных размеров покупки

var optionSchema = new mongoose.Schema({

    grp: String, 
    ratio: String, 
    name: String, 
    price: Number 
});

module.exports = mongoose.model("Option", optionSchema);

вот образец того, что я пытался и потерпел неудачу для возврата данных из БД. SizeOptionArray - это массив вариантов размера, отправленных из корзины покупок при оформлении заказа

sizeOptions.aggregate([

        {
            $match: { _id: { $in:sizeOptionArray} }
        }
])

Это успешно возвращает параметры размера, если они не дублируются, если кто-то выбрал два разных изображения, но они имеют одинаковый размер. Параметры, запрос возвращает только один. Я бы хотел и того, и другого.

Я также пробовал выполнить запрос к коллекции фотографий, а затем использовать $ lookup, чтобы найти параметр подходящего размера в коллекции sizeOptions, но я не могу заставить это работать либо потому, что sizeOptionsArray для всех размеров товаров в корзине, и я не могу понять, как заставить запрос mon go проходить через идентификаторы по порядку, есть ли способ указать запросу использовать первое значение из массива imageId и первое значение sizeOptionArray, сопоставьте их, затем go второму значению в массиве imageId и второму значению sizeOptionsArray и так далее .?

здесь была неудачная попытка поиска:

Photo.aggregate([    
$lookup:
                 {
                   from: "options",
                   pipeline: [
                      { $unwind: "$sizeOptions"},
                      { $match: { _id: 'sizeOptions' } },   

                   ],
                   as: "Options"
                 }

])

Я подумал, что вам, возможно, придется что-то раскрутить, но вы не используете это правильно или нет ответа. Если кто-нибудь сможет пролить свет на эту проблему, это очень поможет! Если есть совершенно другой способ go по этому поводу, я открыт для всего, что работает, это для личного сайта и не должно соответствовать какому-либо конкретному стандарту c, кроме сохранения его в mongoDB.

Я использую Node.js и mon goose, express, e js ... В идеале, поиск mon go должен использовать пару идентификаторов, идентификатор изображения для получения информации о связанном изображении , и идентификатор sizeOption для запроса цены из базы данных и возврата красивых маленьких объектов документа изображения и документа параметра размера в массиве этих пар, поэтому, если в корзине есть одно или 8 изображений, они все возвращаются, даже если это 8 изображений одного и того же изображения, все они могут иметь одинаковый размер или все иметь разные размеры, или половина может иметь одинаковый размер, а половина - разных размеров, но все они должны быть возвращены независимо от того, есть ли дубликаты.

Спасибо за любую помощь. Интересно пытаться изучить этот материал, но вы можете довольно расстроиться, если не знаете, что делать или даже как сформулировать поиск в Google, чтобы встать на правильный путь.!

Я также пробовал использовать $ addFields в агрегат перед поиском думал, что я мог бы заменить поле данных sizeOptions массивом идентификаторов возвращенных параметров размера из корзины покупок, но это помещает все идентификаторы размера в каждое изображение, что неверно, и я не мог узнать, как просто добавить один идентификатор, связанный с текущим изображением.

 {
        $addFields: { "sizeOptions": newId2 }
 }  

ОБНОВЛЕНИЕ: Мне удалось найти что-то на SO, которое работает для передачи массива идентификаторов параметров размера в find ( ) и возвращение всех совпадений, включая повторяющиеся идентификаторы. Вот фрагмент кода из сообщения:

Mon goose - find () с несколькими одинаковыми идентификаторами

var ids = ['abcd1234', 'abcd1234', 'abcd1234'];
Schema.find({_id: {$in: ids}}, function (err, array) {
  if (err) {
    // handle error
  } else {
    var objects = {};
    array.forEach(o => objects[o._id] = o);
    var dupArray = ids.map(id => objects[id]);
    // here you have objects with duplicates in dupArray:
    console.log(dupArray);
  }
});

Итак, приведенное выше работает, но есть ли более элегантный способ сделать это? Если у меня есть такой массив пар идентификаторов, который отправляется на сервер, когда кто-то оформляет заказ с тележкой для покупок:

[ { imageId-1, sizeOptionId-1 },
  { imageId-2, sizeOptionId-2 },
  { imageId-3, sizeOptionId-1 } ]

Есть ли способ отправить этот массив в mon goose find () или агрегировать и заставить его найти документ для соответствующего imageId, а также использовать связанный sizeOptionId в поиске $, чтобы он нашел правильный идентификатор размера в коллекции sizeOptions и go через все пары идентификаторов изображения / размера в массиве и вернуть их все, даже если есть повторяющиеся идентификаторы imageId и / или одинаковые идентификаторы sizeOption ..?

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