【发布时间】:2019-08-01 11:53:13
【问题描述】:
所以,这些是我的模型
let restaurantSchema = mongoose.Schema({
name: 'string',
restId: 'string',
saved: {type: 'date', default: Date.now()}
})
let userSchema = mongoose.Schema({
firstName: {type: 'string', default: ''},
lastName: {type: 'string', default: ''},
username: {
type: 'string',
required: true,
unique: true
},
beenTo: [restaurantSchema],
toGoTo: [restaurantSchema]
})
我想制作一个提要:“用户 A 想去 X 餐厅,用户 B 想去 Y 餐厅,用户 A 去过 Z 餐厅”等,所有这些都主要按日期排序。所以我一直在尝试使用聚合来提供包含用户名和餐厅名称以及时间戳的文档,这样我就可以使用 {'saved': -1 对所有文档进行排序,无论用户名如何},或者时间戳变成什么。
这是我到目前为止所获得的信息
User.aggregate([
{$match: {username: {$ne: username}}},
{$lookup: {
from: "restaurants",
localField: "beenTo.saved",
foreignField: "saved",
as: "savRest"
}},
{$project: {'savRest.saved': 1, 'savRest.name': 1, 'username': 1}},
{$group: {
_id: null,
sav: {$push: '$savRest.saved'}
}}
])
鉴于数组,我预计我需要在某个时候 $unwind,但我不确定管道的位置...
【问题讨论】:
-
从您的架构看来,Restaurant 是用户文档
beenTo : [RestaurantSchema]的子文档。这会将餐厅文档存储为用户对象的子文档,在这种情况下,$lookup 不会按您的意愿工作。如果您只想将餐厅 ID 存储在数组中,并参考实际的餐厅文档,则需要更改您的架构:beenTo : [{type:mongoose.Schema.Types.Object, ref : 'Restaurant']。如果我误解了您的问题,请对其进行编辑以使其更易于理解。这里有点混乱。 -
我明白了。抱歉,如果它令人困惑,我正在尝试自己理解其中的大部分内容。在这种情况下,假设我对我的架构进行了建议的编辑,我可以得到想要的结果吗?
-
是的,您可以,请告诉我您想要的确切内容,我会帮助您。您想通过聚合管道实现什么目标?
-
我最终想按日期对所有(其他)用户 betTo 和 toGoTo 数组中的所有条目进行排序,从最近开始。
-
所以你想要所有用户,除了给定的用户,这就是你写的原因:
username : {$ne : username}对吗?
标签: mongodb mongoose aggregation-framework