Как добавить поле позиции в каждый документ массива вложенных документов с агрегациями mongodb? - PullRequest
0 голосов
/ 20 марта 2020

В настоящее время я работаю над алгоритмом сопоставления, который вычисляет балл между двумя списками продуктов. Я использую агрегацию mongodb, чтобы добавить поле оценки соответствия, рассчитанное с использованием разных аргументов. На самом деле, алгоритм должен знать положение каждого продукта в списке. Поэтому я подумал, чтобы динамически добавить поле позиции на каждый продукт, чтобы использовать его позже. Я не знаю, какой оператор агрегации mongodb я должен использовать. Может быть, кто-то может мне помочь?

Вот мой список моделей:

const listSchema = mongoose.Schema({
    type: { type: mongoose.Schema.Types.ObjectId, ref: "ListType", required: true },
    links: [{
        brand: { type: mongoose.Schema.Types.ObjectId, ref: "Brand", required: true },
        work: { type: mongoose.Schema.Types.ObjectId, ref: "Product" },
    }],
    associatedUser: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: true }
}, { versionKey: false });

Заранее спасибо, Pierre

1 Ответ

0 голосов
/ 21 марта 2020

Один метод заключается в использовании оператора $reduce, который может быть выполнен в конвейере агрегации или в MongoDB 4.2 в обновлении.

Этот пример заменяет 'arrayField', содержащий

["Hello","World"]

с массивом объектов типа

[{index:0,value:"Hello"},{index:1,value:"World"}]
db.collection.update({},[{$set:{
      arrayField:{
            $reduce:{
                 input:"$arrayField",
                 initialValue:[],
                 in:{ $push:[
                       "$$value",
                       {index:{$size:"$$value"},
                        value:"$$this"}
                 ]}
            }
     }
}}])
...