jjzjj

MongoDB Mgo Sort Skip Limit 聚合管道 - 结果乱序

coder 2024-07-05 原文

我有一个如下所示的文档“项目”:

{
"_id" : ObjectId("5a146ce6cca59f21e897589b"),
"platform" : "example_platform",
"mp_id" : "example_marketplace_id",
"category" : {
    "platform" : "example_platform",
    "id" : 999,
    "name" : "example_category_name"
},
"image_urls" : [ 
"http://example.com/image.jpg"
],
"title" : "example_title",
"seller" : {
    "username" : "example_username",
    "platform" : "example_platform",
},
"quantity_sold" : 100,
"sales" : [ 
    {
        "_id" : ObjectId("5a146cf3cca59f21e8975951"),
        "time" : ISODate("2017-09-09T04:07:36.000Z"),
        "amount" : 31.4500007629395,
        "currency" : "USD",
        "buyer" : {
            "username" : "example_username",
            "platform" : "example_platform",
        },
        "item_id" : ObjectId("5a146ce6cca59f21e897589b")
    }, 
    {
        "_id" : ObjectId("5a146cf3cca59f21e8975952"),
        "time" : ISODate("2017-11-16T01:24:10.000Z"),
        "amount" : 27.0900001525879,
        "currency" : "USD",
        "buyer" : {
            "username" : "example_username",
            "platform" : "example_platform",
        },
        "item_id" : ObjectId("5a146ce6cca59f21e897589b")
    }
]

我想做的是能够查询 db 以在给定时间范围内按商品售出次数对商品进行排序,并使用 skip 和 limit(或其他方法)对这些结果进行分页.

这是我的聚合查询/管道目前的样子:

func (this SellerItemsQuery) MakePipeline() []bson.M{
    var pipeline = []bson.M{
        {"$match": bson.M{
            "seller.username": this.Username,
            "seller.platform": this.Platform,
        }}}
    if !this.SalesFromDate.Equal(time.Time{}) && !this.SalesToDate.Equal(time.Time{}) {
        pipeline = append(pipeline, bson.M{
            "$addFields": bson.M{
                "sales": bson.M{
                    "$filter": bson.M{
                        "input": "$sales",
                        "as":    "sale",
                        "cond":  bson.M{"$and": []bson.M{{"$gte": []interface{}{"$$sale.time", this.SalesFromDate}}, {"$lte": []interface{}{"$$sale.time", this.SalesToDate}}}},
                    },
                },
            },
        })
    }
    pipeline = append(pipeline, bson.M{
        "$addFields": bson.M{
            "num_sales": bson.M{
                "$size": bson.M{
                    "$ifNull": []interface{}{
                        "$sales", []interface{}{},
                    },
                },
            },
        },
    })
    pipeline = append(pipeline, bson.M{
        "$sort": bson.M{"num_sales": -1,
                        "_id": 1},
    }, bson.M{
        "$skip": this.Skip,
    }, bson.M{
        "$limit": this.Limit,
    })
    return pipeline

目前的问题是它返回的结果非常不一致。一次按 25 个项目分页时(skip=0&limit=25、skip=25&limit=25 等)。第一个结果集通常是正确的,给定时间段内最畅销的商品出现在顶部,销售数量按预期下降,但是到第二、第三或第四组 25 个结果几乎完全随机。集合中的项目销售数量将突然下降到零,而下一组将包括具有 3 个销售的项目,等等。完全乱序,重复的项目也会出现,即使我已经包含了一个排序 { _id: 1} 在管道中,我认为这可以解决这个问题。

最佳答案

问题是 bson.M 结构是无序的,所以有时它会先按“_id”字段排序,然后再按“num_sales”字段排序,这会导致结果集乱序。改为使用 bson.D 有序对:

bson.M{
        "$sort": bson.M{"num_sales": -1,
                        "_id": 1},
    },

成为:

bson.M{
        "$sort": bson.D{{"num_sales", -1},
                {"_id", 1}},
    },

关于MongoDB Mgo Sort Skip Limit 聚合管道 - 结果乱序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47447625/

有关MongoDB Mgo Sort Skip Limit 聚合管道 - 结果乱序的更多相关文章

  1. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

  2. ruby-on-rails - Assets 管道损坏 : Not compiling on the fly css and js files - 2

    我开始了一个新的Rails3.2.5项目,Assets管道不再工作了。CSS和Javascript文件不再编译。这是尝试生成Assets时日志的输出:StartedGET"/assets/application.css?body=1"for127.0.0.1at2012-06-1623:59:11-0700Servedasset/application.css-200OK(0ms)[2012-06-1623:59:11]ERRORNoMethodError:undefinedmethod`each'fornil:NilClass/Users/greg/.rbenv/versions/1

  3. ruby - Rails Elasticsearch 聚合 - 2

    不知何故,我似乎无法获得包含我的聚合的响应...使用curl它按预期工作:HBZUMB01$curl-XPOST"http://localhost:9200/contents/_search"-d'{"size":0,"aggs":{"sport_count":{"value_count":{"field":"dwid"}}}}'我收到回复:{"took":4,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":90,"max_score":0.0,"hits":[]},"a

  4. c# - Ruby 等效于 C# Linq 聚合方法 - 2

    什么是Linq聚合方法的ruby​​等价物。它的工作原理是这样的varfactorial=new[]{1,2,3,4,5}.Aggregate((acc,i)=>acc*i);每次将数组序列中的值传递给lambda时,变量acc都会累积。 最佳答案 这在数学以及几乎所有编程语言中通常称为折叠。它是更普遍的变形概念的一个实例。Ruby从Smalltalk中继承了这个特性的名称,它被称为inject:into:(像aCollectioninject:aStartValueinto:aBlock一样使用。)所以,在Ruby中,它称为inj

  5. ruby - gem 推送结果为 "package metadata is missing" - 2

    我正在尝试将我更新的gem推送到ruby​​gems.com并得到以下结果。~/dev/V2/V2GPTI(master)$gembuildv2gpti.gemspecSuccessfullybuiltRubyGemName:v2gptiVersion:0.2File:v2gpti-0.2-universal-darwin-13.gem~/dev/V2/V2GPTI(master)$gempushv2gpti.gemspecERROR:Whileexecutinggem...(Gem::Package::FormatError)packagemetadataismissinginv2g

  6. ruby - 猴子修补 float 中缀运算符产生意想不到的结果 - 2

    重新定义Float#/似乎没有效果:classFloatdef/(other)"magic!"endendputs10.0/2.0#=>5.0但是当另一个中缀运算符Float#*被重新定义时,Float#/突然采用了新的定义:classFloatdef/(other)"magic!"enddef*(other)"spooky"endendputs10.0/2.0#=>"magic!"我很想知道是否有人可以解释这种行为的来源,以及其他人是否得到相同的结果。ruby:ruby2.0.0p353(2013-11-22)[x64-mingw32]要快速确认错误,请运行thisscript.

  7. ruby-on-rails - 尝试编辑时,Rails form_for 结果为 POST 而不是 PUT - 2

    我正在使用Rails4并遇到以下错误。RoutingErrorNoroutematches[POST]"/logs/1/meals/13/edit我正在使用:meal传递模型对象的form_for,并且编辑页面正确呈现。但是,Rails似乎并没有检查膳食对象是否已经保存,因此它一直尝试将表单发送到#create操作并尝试发出POST请求,而不是将表单发送到更新操作并进行当我点击提交时一个PUT请求。我如何让form_for识别我正在尝试更新现有对象并且需要PUT而不是POST?其他一切正常,我已经运行了所有迁移。我是Rails的新手,几乎一整天都在尝试自己解决这个问题。请帮忙!请注意,

  8. ruby - 为什么会.is_a?和 .class 给出相互矛盾的结果? - 2

    我有三个属于同一个类的对象。一个是通过Item.new创建的,另外两个是从数据库(Mongoid)中提取的。我将这些对象中的一个/任何一个传递给另一个方法,并通过is_a?检查该方法中的类型:definitialize(item,attrs=nil,options=nil)super(attrs,options)raise'invaliditemobject'unlessitem.is_a?(Item)好吧,这次加薪被击中了。所以我在Rails控制台中检查类、is_a和instance_of。我得到相互矛盾的结果。为什么它们有相同的class但只有其中一个是那个class的instan

  9. ruby - 带有位串的意外解包结果 - 2

    为什么当我打开irb并运行时放'A'.unpack("B8")我得到01000001但是当我运行放'A'.unpack("B4B4")我只得到0100而不是[0100,0001]?unpack的分辨率是不是只有一个完整的字节?一点都不差? 最佳答案 让我们做一些测试来理解行为:>'A'.unpack('B8')=>["01000001"]它返回char'A'的8个最高有效位(MSB)>'A'.unpack('B4')=>["0100"]它返回char'A'的4MSBs>'A'.unpack('B16')=>["01000001"]它

  10. ruby - 为什么我会看到这两个几乎相同的 Ruby 正则表达式模式的不同结果,为什么一个匹配我认为不应该匹配的内容? - 2

    使用Ruby1.9.2,我在IRB中有以下Ruby代码:>r1=/^(?=.*[\d])(?=.*[\W]).{8,20}$/i>r2=/^(?=.*\d)(?=.*\W).{8,20}$/i>a=["password","1password","password1","pass1word","password1"]>a.each{|p|puts"r1:#{r1.match(p)?"+":"-"}\"#{p}\"".ljust(25)+"r2:#{r2.match(p)?"+":"-"}\"#{p}\""}这会产生以下输出:r1:-"password"r2:-"password"r1:

随机推荐