在this question之后@NeilLunn优雅地回答,这是我的问题更详细。
这是一组文件,有些没有user_id。 user_id代表创建文档的用户:
{ "user_id" : 11, "content" : "black", "date": somedate }
{ "user_id" : 6, "content" : "blue", "date": somedate }
{ "user_id" : 3, "content" : "red", "date": somedate }
{ "user_id" : 4, "content" : "black", "date": somedate }
{ "user_id" : 4, "content" : "blue", "date": somedate }
{ "user_id" : 90, "content" : "red", "date": somedate }
{ "user_id" : 7, "content" : "orange", "date": somedate }
{ "content" : "orange", "date": somedate }
{ "content" : "red", "date": somedate }
...
{ "user_id" : 4, "content" : "orange", "date": somedate }
{ "user_id" : 1, "content" : "orange", "date": somedate }
{ "content" : "red", "date": somedate }
{ "user_id" : 90, "content" : "purple", "date": somedate }
前端正在拉页面,所以每个页面都有10个项目,我这样做有限制和跳过,它运行得很好。
如果我们有登录用户,我想显示当前登录的用户文档,根据他与之交互的用户,他可能会发现更有趣第一。
当前用户可能感兴趣的用户列表按分数排序,位于mongo之外。所以第一个元素是我想要首先显示他的文档的最重要的用户,列表中的最后一个用户是最不重要的。
列表是一个简单的数组,如下所示: [4,7,90,1]。
创建此用户分数的系统不在mongo内,但如果有帮助,我可以复制数据。我也可以更改数组以包含分数。
我想要完成的是以下内容:
从列表中获取按user_id重要性排序的文档,以便user_id 4中的文档将首先显示,user_id中的文档为7秒,依此类推。如果列表中没有用户,我希望显示其余文档。像这样:
我该如何做到这一点?我从mongo那里问过多吗?
答案 0 :(得分:6)
鉴于数组[4,7,90,1]
您在查询中想要的是:
db.collection.aggregate([
{ "$project": {
"user_id": 1,
"content": 1,
"date": 1,
"weight": { "$or": [
{ "$eq": ["$user_id": 4] },
{ "$eq": ["$user_id": 7] },
{ "$eq": ["$user_id": 90] },
{ "$eq": ["$user_id": 1] },
]}
}},
{ "$sort": { "weight": -1, "date": -1 } }
])
那样做的是,对于$or
条件中包含的每个项目,user_id
字段都会根据提供的值进行测试,$eq
会返回1
或{ {1}}或0
。{/}。{1}}
您在代码中执行的操作是针对您构建数组条件true
的数组中的每个项目。所以它只是为每个equals条件创建一个哈希结构,将它传递给一个数组并将其作为false
条件的数组值插入。
我可能应该将$ cond运算符从前面的代码中删除,因此这部分会更清楚。
这里是Ruby Brain的一些代码:
$or
如果你想拥有单独的权重并且我们假设键值对,那么你需要用$ cond嵌套:
$or
请注意,它只是一个返回值,这些不需要按顺序排列。你可以考虑一下那一代。
要生成此结构,请参阅此处: