используя 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: [] } ]
Спасибо за любую помощь.
Вероятно, это скорее «совет на будущее», потому что ваша реальная проблема, похоже, заключается в том, что "from": "User" от "from": "users" или даже "from": User.collection.name, если у вас действительно загружена модель User в прицел. MongoDB не знает, что такое «Имя модели», и ему нужно «имя коллекции», как оно фактически отображается на сервере. По умолчанию ваш "User"модель - это "users"коллекция.
Большое спасибо. Ты прав! Я поменял "from": "users" и все работает.

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