如何在mongodb / mongoose查询中改变基于参数的结果位置
How to change result position based off parameter in a mongodb / mongoose query?
所以我使用猫鼬和node.js访问mongodb数据库。我想根据一个数字增加每个结果(如果没有增加,则按创建日期排序)。例如:
{ name: 'A',
bump: 0 },
{ name: 'B',
bump: 0 },
{ name: 'C',
bump: 2 },
{ name: 'D',
bump: 1 }
将按顺序检索:C, A, D, b。这如何实现(不遍历数据库中的每个条目)?
试试这样做。存储一个跟踪线程总数#的计数器,我们称其为thread_count
,初始设置为0,因此在某个地方有一个看起来像{thread_count:0}
的文档。
每次创建一个新线程时,首先使用{$inc : {thread_count:1}}
作为修饰符调用findAndModify()
-即,将计数器增加1并返回其新值。
然后当你插入新线程时,使用计数器的新值作为其文档中字段的值,我们称其为post_order
。
所以插入的每个文档的值每次都大1。例如,您插入的前3个文档看起来像这样:
{name:'foo', post_order:1, created_at:... } // value of thread_count is at 1
{name:'bar', post_order:2, created_at:... } // value of thread_count is at 2
{name:'baz', post_order:3, created_at:... } // value of thread_count is at 3
等。
因此,您可以有效地查询并按post_order
排序为ASCENDING,并且它将按照最老到最新的顺序返回它们(或从最新到最老的降序)。
然后要"碰撞"一个线程的排序顺序,当它被投票,你可以用{$inc:{post_order:1}}
调用update()
的文档。这将使它在结果排序的顺序上提前1。如果两个线程的post_order值相同,created_at将区分哪个先出现。因此,您将按post_order, created_at
排序。
您将需要在post_order
和created_at
上有一个索引
让我们猜测您的代码是变量response
(这是一个数组),然后我会做:
response.sort(function(obj1, obj2){
return obj2.bump - obj1.bump;
});
或者如果你还想记住名字的顺序:
response.sort(function(obj1, obj2){
var diff = obj2.bump - obj1.bump;
var nameDiff = (obj2.name > obj1.name)?-1:((obj2.name < obj1.name)?1:0);
return (diff == 0) ? nameDiff : diff;
});
不是一个令人愉快的答案,但是您要求的解决方案是不现实的。我的建议是:
-
为你的对象添加
OrderPosition
属性,而不是Bump -
把"碰撞"想象成一个事件。最好将其表示为事件处理程序函数。当一个项被业务逻辑中的任何触发器"碰撞"时,需要调整项的集合。
var currentOrder = this.OrderPosition this.OrderPosition = currentOrder - bump; // moves your object up the list // write a foreach loop here, iterating every item AFTER the items unadjusted // order, +1 to move them all down the list one notch.
这确实需要迭代许多项,我知道您试图阻止这种情况,但我不认为有任何其他方法可以安全地确保项排序的完整性-特别是相对于稍后发生的其他拉取集合。
我不认为纯基于查询的解决方案是可能与您的文档模式(我假设您有createdDate
和bump
字段)。相反,我建议使用一个名为sortorder
的字段来跟踪所需的检索顺序:
-
sortorder
是初始创建时间戳。如果没有"凸起",则按此字段排序会给出正确的顺序。 - 如果有"bump",则
sortorder
无效。所以只需纠正sortorder
值:每次发生"碰撞"时,交换碰撞文档的sortorder
字段和它直接前面的文档。这实际上是在排序顺序上"凸起"文档。 - 查询时按
sortorder
排序
您可以删除bump
和createdDate
字段,如果它们不在其他地方使用。
说句题外话,大多数社交网站不会根据投票数(或"访问量")直接操纵帖子的显示位置。相反,投票数是用来计算分数的。然后根据这个分数对帖子进行排序和显示。在您的示例中,应该将createdDate
和bumps
组合成一个分数,以便可以在查询中对进行排序。
- “add”函数适用于不同的链接/参数组合
- JavaScript等效于PHP传递参数
- 如何传递参数并应用于函数
- 正则表达式类似于Javascript中的参数函数
- 错误:areq 错误的参数参数“面板控制器”不是一个函数,未定义
- 回调函数的参数如何依赖于排序
- Express v4:如何在参数中间件之前运行特定于路由的中间件
- 布尔值作为参数/参数
- JavaScript switch 语句并将返回应用于函数参数
- 哪个javascript函数类似于parsefloat,它将语言环境作为参数
- Javascript 函数参数参数或全局变量
- 错误:ng:areq错误参数:参数'registerController'不是函数,未定义
- 类似于attr()函数,带有回调函数的参数
- Ramda curry:如何将参数应用于多个参数
- 将方法参数/参数传递给方法引用绑定,匿名,命名
- 具有依赖于父参数的Onclick函数
- javascript中的Unity动态参数/参数类型
- 如何传递参数/参数从一个javascript片段到另一个,当评估
- 是否可以访问DOM元素'this'在jQuery插件的非函数参数参数中
- aurelia路由器-传递一次参数(参数不会记录在浏览器历史记录中)