mongodb聚合$按最接近某个值的字段值排序

时间:2018-04-06 11:13:29

标签: javascript mongodb meteor aggregation-framework

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

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'}]

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

2 个答案:

答案 0 :(得分: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}}

从文档中排除该属性

答案 1 :(得分:0)

您可以使用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