代码之家  ›  专栏  ›  技术社区  ›  afollestad

如何按外框排序,外框不使用字母/数字顺序?[复制]

  •  0
  • afollestad  · 技术社区  · 8 年前

    跟随 this question @NeilLunn优雅地回答说,这是我的问题,更详细。

    文件:

    { "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]。

    创建这个用户分数的系统不在mongo中,但是如果有帮助的话,我可以复制数据。我还可以更改数组以包含分数。

    1. 用户为4的所有文档
    2. 用户为7的所有文档
    3. 所有用户为90的文档
    4. 用户为1的所有文档
    5. 所有其他文件

    我该怎么做?我是不是对蒙哥要求太高了?

    0 回复  |  直到 9 年前
        1
  •  7
  •   Community Mohan Dere    9 年前

    给定数组 [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 0 对于 true false .

    您在代码中所做的是针对数组中的每一项 建造 $或 $或 条件。

    我可能应该把$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 } }
    ]
    

    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

    推荐文章