Я пытаюсь создать своего рода функцию новостной ленты для своего приложения. Я пытаюсь понять, как это сделать с помощью вложенного запроса в Mongo / Mongoose, а не с помощью агрегата. (остальная часть приложения использует вложенные запросы), и я бы предпочел не изменять запрос с помощью ванильного javascript, чтобы получить идеальный объект, если мне это не нужно.
Я бы хотел, чтобы друзья текущего пользователя для каждого друга получали все свои сообщения, а затем отсортировывали их по дате.
Я хочу сделать свой текущий запрос более эффективным, так как есть дополнительный шаг
мой запрос в мангусте
User.findOne({ _id: req.userId }, 'friends.user -_id')
.populate({
path: 'friends.user',
model: 'User',
select: 'posts -_id',
populate: {
path: 'posts',
model: 'Post',
select: 'date author user desc -_id',
options: { sort: { date: -1 } },
populate: {
path: 'author user',
model: 'User',
select: 'profile.firstname profile.lastname profile.avatar username'
},
},
})
результаты, достижения
{
"newsfeed": [
{
"user": {
"posts": [
{
"user": {
"profile": {
"firstname": "user2",
"lastname": "user2",
"avatar": "c66620a0ef057908a1663725956ac03a.jpg"
},
"_id": "5b56549fcba9231e5d1e848d",
"username": "kenne"
},
"author": {
"profile": {
"firstname": "user1",
"lastname": "user1",
"avatar": "9e7b60e534cf761f41d6afe3d97295c9.jpg"
},
"_id": "5b562382a16cde19638e4bee",
"username": "user1"
},
"date": "2018-07-24T06:40:37.413Z",
"desc": "sdfsdf"
},
{
"user": {
"profile": {
"firstname": "user2",
"lastname": "user2",
"avatar": "c66620a0ef057908a1663725956ac03a.jpg"
},
"_id": "5b56549fcba9231e5d1e848d",
"username": "user2"
},
"author": {
"profile": {
"firstname": "user1",
"lastname": "user1",
"avatar": "9e7b60e534cf761f41d6afe3d97295c9.jpg"
},
"_id": "5b562382a16cde19638e4bee",
"username": "user1"
},
"date": "2018-07-24T06:40:17.180Z"
},
{
"user": {
"profile": {
"firstname": "user2",
"lastname": "user2",
"avatar": "c66620a0ef057908a1663725956ac03a.jpg"
},
"_id": "5b56549fcba9231e5d1e848d",
"username": "user2"
},
"author": {
"profile": {
"firstname": "user2",
"lastname": "user2",
"avatar": "c66620a0ef057908a1663725956ac03a.jpg"
},
"_id": "5b56549fcba9231e5d1e848d",
"username": "user2"
},
"date": "2018-07-23T22:20:15.246Z",
"desc": "Gibberish"
}
]
}
},
{
"user": {
"posts": [
{
"user": {
"profile": {
"firstname": "user3",
"lastname": "user3",
"avatar": "132df94df5733efd41609681bc7f71f9.jpeg"
},
"_id": "5b5382f3661a8d7023e1ae65",
"username": "user3"
},
"author": {
"profile": {
"firstname": "user3",
"lastname": "user3",
"avatar": "132df94df5733efd41609681bc7f71f9.jpeg"
},
"_id": "5b5382f3661a8d7023e1ae65",
"username": "user3"
},
"date": "2018-07-21T19:09:45.543Z",
"desc": "Gibberish"
}
]
}
}
]
}
поскольку мне нужно сначала получить друзей пользователя, текущий запрос создает два пользовательских объекта, каждый со своими собственными сообщениями, авторами и пользовательскими объектами внутри них.
eg. {"newsfeed": [{"user": {"bios": [...]}}], [{"user": {"bios": [...]}}] }
я хочу что-то вроде этого
{
"newsfeed": [{
"posts": [
{
"user": {
"profile": {
"firstname": "user2",
"lastname": "user2",
"avatar": "c66620a0ef057908a1663725956ac03a.jpg"
},
"_id": "5b56549fcba9231e5d1e848d",
"username": "user2"
},
"author": {
"profile": {
"firstname": "user1",
"lastname": "user1",
"avatar": "9e7b60e534cf761f41d6afe3d97295c9.jpg"
},
"_id": "5b562382a16cde19638e4bee",
"username": "user1"
},
"date": "2018-07-24T06:40:37.413Z",
"desc": "sdfsdf"
},
{
"user": {
"profile": {
"firstname": "user2",
"lastname": "user2",
"avatar": "c66620a0ef057908a1663725956ac03a.jpg"
},
"_id": "5b56549fcba9231e5d1e848d",
"username": "user2"
},
"author": {
"profile": {
"firstname": "user1",
"lastname": "user1",
"avatar": "9e7b60e534cf761f41d6afe3d97295c9.jpg"
},
"_id": "5b562382a16cde19638e4bee",
"username": "user1"
},
"date": "2018-07-24T06:40:17.180Z"
},
{
"user": {
"profile": {
"firstname": "user2",
"lastname": "user2",
"avatar": "c66620a0ef057908a1663725956ac03a.jpg"
},
"_id": "5b56549fcba9231e5d1e848d",
"username": "user2"
},
"author": {
"profile": {
"firstname": "user2",
"lastname": "user2",
"avatar": "c66620a0ef057908a1663725956ac03a.jpg"
},
"_id": "5b56549fcba9231e5d1e848d",
"username": "user2"
},
"date": "2018-07-23T22:20:15.246Z",
"desc": "Gibberish"
},
{
"user": {
"profile": {
"firstname": "user3",
"lastname": "user3",
"avatar": "132df94df5733efd41609681bc7f71f9.jpeg"
},
"_id": "5b5382f3661a8d7023e1ae65",
"username": "user3"
},
"author": {
"profile": {
"firstname": "user3",
"lastname": "user3",
"avatar": "132df94df5733efd41609681bc7f71f9.jpeg"
},
"_id": "5b5382f3661a8d7023e1ae65",
"username": "user3"
},
"date": "2018-07-21T19:09:45.543Z",
"desc": "Gibberish"
}
]}
Как я могу это сделать без использования агрегата? чтобы получить что-то большее
eg. {"newsfeed": [{"posts": [...]}] }
Дополнительная информация
пользователи
const UserSchema = new Schema({
username : String,
friends : [{ user: { type: Schema.Types.ObjectId, ref: 'User'}, status: String }],
profile: {
name : String,
firstname : String,
lastname : String,
avatar : String
}),
posts : [{ type: Schema.Types.ObjectId, ref: 'Post' }]
});
сообщения
const PostsSchema = new Schema({
user : { type: Schema.Types.ObjectId, ref: 'User' },
author : { type: Schema.Types.ObjectId, ref: 'User' },
date : Date,
desc : String
});
пример данных: пользователи
{
"_id" : ObjectId("5b51fd2a3f4ec33546a06648"),
"profile" : {
"firstname" : "user1",
"lastname" : "user1"
"avatar" : "user1.png"
}
"username" : "user1",
"friends" : [
{
"_id" : ObjectId("5b51fd7c3f4ec33546a0664f"),
"user" : ObjectId("5b51fd643f4ec33546a0664c")
},
{
"_id" : ObjectId("5b51fdb53f4ec33546a06655"),
"user" : ObjectId("5b51fd903f4ec33546a06652")
}
]
}
{
"_id" : ObjectId("5b51fd643f4ec33546a0664c"),
"profile" : {
"firstname" : "user2",
"lastname" : "user2"
"avatar" : "user2.png"
}
"posts" : [
{
"_id" : ObjectId("5b51fdcd3f4ec33546a06610"),
"_id" : ObjectId("5b51fdcd3f4ec33546a06611"),
"_id" : ObjectId("5b51fdcd3f4ec33546a06612"),
}
],
"__v" : 5,
"username" : "user2"
},
{
"_id" : ObjectId("5b51fd903f4ec33546a06652"),
"profile" : {
"firstname" : "user3",
"lastname" : "user3"
"avatar" : "user3.png"
},
"posts" : [
{
"_id" : ObjectId("5b51fdce3f4ec33546a06615"),
"_id" : ObjectId("5b51fd2a3f4ec33546a06617")
}
],
"__v" : 5,
"username" : "user3"
}
пример даты: сообщения
{
"_id" : ObjectId("5b51fdcd3f4ec33546a06610"),
"user" : ObjectId("5b51fd2a3f4ec33546a06648"),
"author" : ObjectId("5b51fd2a3f4ec33546a06648"),
"date" : ISODate("2018-07-20T15:18:02.962Z"),
"desc" : "user1 gibberish",
"__v" : 0
}
{
"_id" : ObjectId("5b51fdcd3f4ec33546a06611"),
"user" : ObjectId("5b51fd643f4ec33546a0664c"),
"author" : ObjectId("5b51fd643f4ec33546a0664c"),
"date" : ISODate("2018-07-20T15:19:00.968Z"),
"desc" : "user2 gibberish",
"__v" : 0
}
{
"_id" : ObjectId("5b51fdcd3f4ec33546a06612"),
"user" : ObjectId("5b51fd903f4ec33546a06652"),
"author" : ObjectId("5b51fd903f4ec33546a06652"),
"date" : ISODate("2018-07-20T15:19:44.102Z"),
"desc" : "user3 gibberish",
"__v" : 0
}
{
"_id" : ObjectId("5b51fdce3f4ec33546a06615"),
"user" : ObjectId("5b51fd643f4ec33546a0664c"),
"author" : ObjectId("5b51fd643f4ec33546a0664c"),
"date" : ISODate("2018-07-20T15:19:00.968Z"),
"desc" : "more gibberish",
"__v" : 0
}
{
"_id" : ObjectId("5b51fdce3f4ec33546a06616"),
"user" : ObjectId("5b51fd903f4ec33546a06652"),
"author" : ObjectId("5b51fd903f4ec33546a06652"),
"date" : ISODate("2018-07-20T15:19:44.102Z"),
"desc" : "more gibberish",
"__v" : 0
}