Mongodb: агрегат и поиск $ с ObjectId

используя mongodb 3.4 через MEAN, у меня есть две схемы:

var userSchema = new mongoose.Schema({
email: {
    type: String,
    unique: true,
    required: true,
    trim: true },
username: {
    type: String,
    unique: true,
    required: true,
    trim: true },
password: {
    type: String,
    required: true }
},
{ collection: 'users'}
);
module.exports = mongoose.model('User', userSchema);

и другой:

var followSchema = new mongoose.Schema({
username: {
   type: mongoose.Schema.Types.ObjectId,
   ref: 'User'
},
   followers: [{
   type: mongoose.Schema.Types.ObjectId,
   ref: 'User'
}],
following: [{
   type: mongoose.Schema.Types.ObjectId,
   ref: 'User'
}]
},{   collection: 'follows'}
);
module.exports = mongoose.model('Follow', followSchema);

приводящий (в качестве примера) к объекту ниже, когда у пользователя A есть последователи и следующие:

{
   "_id" : ObjectId("ae1d6f8..."),
   "username" : ObjectId("User A"),
   "followers" : [
       ObjectId("User B")
       ObjectId("User C")
    ],
   "following": [
       ObjectId("User B")
    ]
}

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

Follow.aggregate([{
                $match: {
                    "username": user_id
                }
            },
                {
                    $lookup: {
                        "from": "User",
                        "localField": "following",
                        "foreignField": '_id',
                        "as": "userFollowing"
                    }
                },
                {
                    $lookup: {
                        "from": "User",
                        "localField": "followers",
                        "foreignField": '_id',
                        "as": "userFollowers"
                    }
                }, {
                    $project: {
                        "username": 1,
                        "userFollowers": 1,
                        "userFollowing": 1
                    }
                }
            ]).exec(function (err, doc) {
                console.info(doc);
                rest.json({
                    'state': true,
                    'msg': 'Follow list',
                    'doc': doc
                })
            })

Это результаты пустого массива userFollowing и userFollowers:

[ { _id: 5aeca47e600ff8f00617ac05,
    username: 5ae1ee337863273c0adac1d7,
    userFollowing: [],
    userFollowers: [] } ]

Спасибо за любую помощь.

Хорошо. Вместо того, чтобы показывать такие вещи, как ObjectId("User B"), вместо этого покажите нам некоторые «настоящие документы», которые, как вы ожидаете, будут соответствовать друг другу. Показать документы в том виде, в котором они отображаются в оболочке mongo. Не вывод журнала консоли и не скриншоты из Robomongo или Compass. Оболочка mongo - это то, что будет отображать документы в виде «текстовой» формы, которую вы можете скопировать в свой вопрос, и показывать нам правильные данные и типы.

Neil Lunn 05.05.2018 12:08

Вероятно, это скорее «совет на будущее», потому что ваша реальная проблема, похоже, заключается в том, что "from": "User" от "from": "users" или даже "from": User.collection.name, если у вас действительно загружена модель User в прицел. MongoDB не знает, что такое «Имя модели», и ему нужно «имя коллекции», как оно фактически отображается на сервере. По умолчанию ваш "User"модель - это "users"коллекция.

Neil Lunn 05.05.2018 12:11

Большое спасибо. Ты прав! Я поменял "from": "users" и все работает.

Gilles Cheniara 05.05.2018 13:28
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
3
64
0

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