【发布时间】:2017-10-27 08:10:13
【问题描述】:
我有以下查询。其中field_a 是String 属性,field_b 是Number 类型的数组。我想要一个具有属性field_a 和field_b 且具有独特组合的数组。这里field_a 包含数值,但采用字符串格式。所以我想在聚合管道中应用自然排序。 $natural 只能用于此类查询 db.collection.find().sort( { $natural: 1 } )
那么如何在 MongoDB 中使用自然排序,或者我需要依赖 JS 函数或 lodash/underscore.js ?
db.collection.aggregate([
{"$group": { "_id": { field_a: "$field_a", field_b: "$field_b" } } },
{ $project: { a: "$_id" } },
{"$group": {"_id": 'a', "res": {"$addToSet": "$_id" }}},
{"$unwind": "$res"},
{"$sort": { "res": 1}},
{"$group": { "_id": null, "res": {"$push": "$res" }}}
])
【问题讨论】:
-
谁告诉你
$natural会在这里帮助你?它的用法与您所说的无关。您正在谈论将像[ "5", "50", "6", 60" ]这样的字符串排序为数字顺序,对吗?你不能这样做,除非我们花哨并“零填充”这些值。 -
@NeilLunn 没有人告诉我,但我认为它可以工作。 “除非我们花哨并“零填充”值”是什么意思?
-
您的
field_a包含字符串形式的数字数据,就像我上面列出的那样,问题是如图所示"50"认为小于"6"是吗? (意味着我实际上需要你确认)。我的意思是,根据您使用的 MongoDB 服务器版本,您也许可以对此做一些事情来启用服务器端排序。 -
是的,如果我的结果数据是
[ "5", "50", "6", "60" ],我需要它们为[ "5", "6", "50", "60" ] -
好的。附加问题。上述聚合应该达到什么目的?这一切只是为了获得两个字段的独特组合并按排序顺序进行的练习吗?只是试图理解意图,因为采取了许多不必要的步骤。能否请您确认一下您的 mongodb 服务器版本。
标签: mongodb mongoose mongodb-query aggregation-framework