【问题标题】:mongodb aggregate $sort by field value closest to some valuemongodb 聚合 $sort 按最接近某个值的字段值
【发布时间】:2018-04-07 16:34:09
【问题描述】:

我想使用 最接近 92 的聚合 $sort 价格值对以下聚合输出进行排序 我使用的聚合直到

db.units.aggregate([
{$match: {category: 'a'}},
{$limit: 3},
{$project: {price:1, name: 1, category: 1}}
]);

输出

[{'_id': '111', 'price': 100, 'name': 'abc', 'category': 'a'}
{'_id': '222', 'price': 90, 'name': 'efg', 'category': 'a'}
{'_id': '333', 'price': 80, 'name': 'xyz', 'category': 'a'}]

期望的输出:

[{'_id': '222', 'price': 90, 'name': 'efg', 'category': 'a'}
{'_id': '111', 'price': 100, 'name': 'abc', 'category': 'a'}
{'_id': '333', 'price': 80, 'name': 'xyz', 'category': 'a'}]

注意:价格字段是嵌套对象。

【问题讨论】:

    标签: javascript mongodb meteor aggregation-framework


    【解决方案1】:

    这是一个有趣的问题。好吧,这就是我会做的事情

    db.units.aggregate([
    
    {$match: {category: 'a'}},
    
    {$project: {diff: {$abs: {$subtract: [92, '$price']}}, doc: '$$ROOT'}},
    
    {$project :{"diff" : 0}},
    
    {$sort: {diff: 1}}
    
    ])
    

    现在,这里发生的事情是,我将 price 值与提到/指定值的绝对差值。这样你就可以按差异排序。是的..您甚至可以使用{$project :{"diff" : 0}}从文档中排除该属性

    【讨论】:

      【解决方案2】:

      你可以使用92 - '$price'的绝对值来得到这个结果:

      查询是

      db.collection.aggregate([{
          "$project": {
              "price": "$price",
              "name": "$name",
              "category": "$category",
              "diff": {
                  "$abs": {
                      "$subtract": ["$price", 92]
                  }
              }
          }
      }, {
          "$sort": {
              "diff": 1
          }
      }])
      

      输出:

      [
        {
          "_id": "222",
          "category": "a",
          "diff": 2,
          "name": "efg",
          "price": 90
        },
        {
          "_id": "111",
          "category": "a",
          "diff": 8,
          "name": "abc",
          "price": 100
        },
        {
          "_id": "333",
          "category": "a",
          "diff": 12,
          "name": "xyz",
          "price": 80
        }
      ]
      

      你可以在这里试试:mongoplayground.net/p/vfAwWMPCDbl

      【讨论】:

      • 与第一个答案有何不同?
      • @UsmanRana 也是一样的想法,没看到你已经发布了这个解决方案
      • 冷静一下。没关系:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      相关资源
      最近更新 更多