Поиск агрегации Mongo

Я пытаюсь сделать следующее

Найдите в журнале все призы, введенные пользователем. вернуть номера заказов и название

Я использую структуру агрегации mongo.

  1. Подхожу по userId
  2. Я группирую призы по одному и тому же продукту, а затем нажимаю номера заказов
  3. Я хочу посмотреть коллекцию призов, чтобы найти название призов.

Поиск не возвращает никаких элементов

Вот код агрегации

db.pointslogs.aggregate(

    // Pipeline
    [
        // Stage 1
        {
            $match: {
                "user": ObjectId("5aacff47c67f99103bcbf693")
            }
        },

        // Stage 2
        {
            $group: {
                _id: "$productPurchased",
                orderNumber: { $push: "$orderNumber" }
            }
        },

        // Stage 3
        {
            $unwind: {
                path : "$orderNumber",

            }
        },

        // Stage 4
        {
            $lookup: {
                "from" : "prizes",
                "localField" : "_id",
                "foreignField" : "_id",
                "as" : "title"
            }
        },

    ]

    // Created with Studio 3T, the IDE for MongoDB - https://studio3t.com/

);

Вот модели (журнал баллов ниже)

var mongoose = require('mongoose');
var Schema =  mongoose.Schema;

var schema = new Schema({
    orderNumber: {type: String, required: true},
    productPurchased: {type: String, require: true},
    answer: {type: String},
    user: [{type: Schema.Types.ObjectId, ref: 'User'}]
});

module.exports =  mongoose.model('PointsLog', schema);

Модель призов ниже

var mongoose = require('mongoose');
var Schema =  mongoose.Schema;

var schema = new Schema({
    title: {type: String, required: true},
    content: {type: String, required: true},
    orderNumber: {type: String, required: true},
    imageUrl: {type: String, required: true},
    stockQty: {type: Number, required: true},
    question: {type: String, required: true},
    answers: [{type: String, required: true}],
    image: {type: String, required: true},
    cost: {type: Number, required: true },
    //entries: {type: Int},
    //user: {type: Schema.Types.ObjectId, ref: 'User'}
    user: [{type: Schema.Types.ObjectId, ref: 'User'}]

});

module.exports =  mongoose.model('Prize', schema);

Не уверен, почему поиск ничего не возвращает

productPurchased - это «строка», как определено в вашей схеме. Что вы ожидаете от коллекции "prizes"? Если вы думаете, что он «похож» на ObjectId, который есть в целевой коллекции, так как это поле _id, то посмотрите еще раз. Строки и значения Objectid разные, как бы вы их ни "красиво распечатали". Покажите два документа и укажите на то, что вы ожидаете сопоставить, если вы все еще не понимаете.
Neil Lunn 01.05.2018 12:58

ProductPurchased - это _id приза, но он хранится в виде строки, поэтому я думаю, что вы говорите, что в структуре агрегации вы не можете сопоставить строку с objectId, поэтому лучше при записи журналов хранить как objectId и не нить?

user2389087 01.05.2018 13:31

См. Обновить поле MongoDB, используя значение другого поля. Нет другого способа «обновить» поле в коллекции без зацикливания всех документов в коллекции, преобразования в ObjectId через функцию и обратной записи данных.

Neil Lunn 01.05.2018 13:33
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
3
81
1

Ответы 1

 1)You can use the upgraded lookup


        Below is an Example->

        db.pointslogs.aggregate([
 // Stage 1
        {
            $match: {
                "user": ObjectId("5aacff47c67f99103bcbf693")
            }
        },

        // Stage 2
        {
            $group: {
                _id: "$productPurchased",
                orderNumber: { $push: "$orderNumber" }
            }
        },

        // Stage 3
        {
            $unwind: {
                path : "$orderNumber",

            }
        },

        // Stage 4
           {
              $lookup:
                 {
                   from: "prizes",
                   let: { oNumber: "$orderNumber" },
                   pipeline: [
                      { $match:{ $expr: { $eq: [ "$orderNumber",  "$$oNumber" ] }                  }
                         }
                      },
                      { $project: { 
        title: 1,
        content: 1,
        orderNumber: 1,
        imageUrl: 1,
        stockQty: 1,
        question: 1,
        answers: 1,
        image: 1,
        cost: 1,
        user: 1
    } }
                   ],
                   as: "orderNumber"
                 }
            }
        ])

Другие вопросы по теме