蒙戈:如何通过外部砝码排序蒙戈:如何通过外部砝码排序(Mongo: how to sort by e

2019-05-12 05:47发布

下面这个问题该@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个项目,我做到这一点与限制,跳过和它工作得很好。

如果我们有一个登录的用户,我想显示对登录用户的文件,目前他可能会发现第一个更有趣的基础上,他与交互的用户。

当前用户可能感兴趣的用户列表是通过得分排序,位于蒙戈之外。 因此,第一个元素是我想首先显示他的证件是最重要的用户,而名单上的最后一个用户是最重要的。

该列表是一个简单的阵列,其看起来像这样:[4,7,90,1]。

这创造了这个用户评分系统未设蒙戈内,但我可以复制的数据是否会有所帮助。 我还可以改变阵列为包括分数数量。

我想做到的是以下几点:

获得通过从列表中USER_ID的重要性排序的文件,这样从USER_ID 4号文件将首次现身,从USER_ID7秒文档等等。 当这里没有留在名单上的用户我想显示的文件的其余部分。 像这样:

  1. 与user_d所有文件:4
  2. 与user_d所有文件:7
  3. 与user_d所有文件:90
  4. 与user_d所有文件:1
  5. 该文件的所有其他

我应该如何做到这一点? 我要求从蒙戈太多了?

Answer 1:

鉴于阵列[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返回10truefalse

你在你的代码做的是对你有数组中你建立的阵列条件的每个项目$or 。 所以它只是创造一个哈希结构对于每个等于条件,将它传递给一个数组和堵塞,在作为数组值$or条件。

我也许应该离开了$ COND运营商走出了此前代码,所以这部分将是更清晰的。

下面是Ruby的大脑一些代码:

userList = [4, 7, 90, 1];

orCond = [];

userList.each do |userId|
  orCond.push({ '$eq' => [ 'user_id', userId ] })
end

pipeline = [
    { '$project' => {
        'user_id' => 1,
        'content' => 1,
        'date' => 1,
        'weight' => { '$or' => orCond }
    }},
    { '$sort' => { 'weight' => -1, 'date' => -1 } }
]

如果你想有个人的重量和我们假设键值对,那么你需要用$ COND巢:

db.collection.aggregate([
   { "$project": {
       "user_id": 1,
       "content": 1,
       "date": 1,
       "weight": { "$cond": [
           { "$eq": ["$user_id": 4] },
           10,
           { "$cond": [ 
               { "$eq": ["$user_id": 7] },
               9,
               { "$cond": [
                   { "$eq": ["$user_id": 90] },
                   7,
                   { "$cond": [
                       { "$eq": ["$user_id": 1] },
                       8, 
                       0
                   ]}
               ]}
           ]}
       ]}
   }},
   { "$sort": { "weight": -1, "date": -1 } }
])

请注意,这只是一个返回值,这些并不需要在顺序。 你可以想想这一代。

对于产生这种结构在这里看到:

https://stackoverflow.com/a/22213246/2313887



文章来源: Mongo: how to sort by external weight