草庐IT

mongodb - mongo $slice 查询反向索引超出范围

coder 2023-10-27 原文

mongo 中的以下查询行为很奇怪:

db.items.findOne({},{ "List": { "$slice": [ skip, 3 ] }})

首先: 它返回的不是仅具有 ["_id","List"] 键的一个对象,而是一个完整的对象。

第二个: 如果 skip 为负且 |skip| 高于 list.length 则它返回前三个元素,就好像 skip==0/p>

我期望:

{
       "_id" : ObjectId("542babf265f5de9a0d5c2928"),
       "List" : [
                1,
                2,
                3,
                4,
                5
        ]
        "other" : "not_important"
}

查询:

db.items.findOne({},{ "List": { "$slice": [-10, 3 ] }})

得到:

{
       "_id" : ObjectId("542babf265f5de9a0d5c2928"),
       "List" : []
}

相反,我得到:

{
       "_id" : ObjectId("542babf265f5de9a0d5c2928"),
       "List" : [
                1,
                2,
                3
        ]
        "other" : "not_important"
}

为什么?

我使用的是 mongoDB 2.4.10

最佳答案

Second: if skip is negative and |skip| is higher than list.length then it returns the first three elements as though skip==0

是的。这就是 mongodb 内部使用的 javascript Array.prototype.slice() 方法的工作原理。

根据ECMAScript® Language Specification ,

If relativeStart is negative, let k be max((len + relativeStart),0); else let k be min(relativeStart, len).

在你的例子中,relativeStart 是 -10k = max((-10+5),0), k = 0;(其中,5 是数组的长度)。

因此,在这些情况下,kskip 将始终为 0

First: Instead of returning one object with ["_id","List"] keys only, it returns a full object.

是的,投影运算符就是这样工作的。除非在投影参数中明确指定了 inclusionexclusion,否则整个文档将使用投影运算符检索,例如 $slice$elemmatch 正在应用。

db.items.findOne({},{"_id":1,"List": { "$slice": [-10, 3 ] }})

会返回:

{ "_id" : ObjectId("542babf265f5de9a0d5c2928"), "List" : [ 1, 2, 3 ] }

findOne() 方法的第二个参数是not only for simple projection purpose, fields not projected, only if any one 字段 名称的值是01。如果不是,则返回整个文档。如果任何字段有要应用的projection operator,它将被appliedprojected

只要涉及 $slice 运算符,投影机制似乎就会以下面的方式发生。

  • 默认情况下,所有字段都将包含在投影中。
  • 默认情况下,所有字段的值都是基于投影运算符 $slice 导出的,如果为真,则始终显示,而不管下面的情况。

为排除或包含而采取的步骤。

  • 投影参数中指定的字段列表按指定顺序累积。
  • 仅针对遇到值为“0”或“1”的第一个字段: 如果 字段有一个值 '0' - 然后它被排除在外,所有剩余的 字段被标记为包含。 如果一个字段有 '1' - 那么它被包括在内,所有剩余的字段 被标记为排除。
  • 对于所有后续字段,根据以下条件排除或包含它们 他们的值(value)观。

关于mongodb - mongo $slice 查询反向索引超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26203217/

有关mongodb - mongo $slice 查询反向索引超出范围的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  3. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  4. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  5. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  6. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  7. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  8. Ruby 日期参数超出范围 - 2

    我正在尝试使用在我的代码中是动态的Time.local来安排时间。在每个月的第一天,我传递的值是Time.local(2009,9,-1,0)。在PHP中,这会将时间设置为上个月的最后一天。在ruby​​中,我只是得到“ArgumentError:参数超出范围”。是我用错了方法还是什么?谢谢。 最佳答案 您应该使用DateTime类而不是Time。(您可能需要先require'date'并安装activesupportgem。)它比Time更通用,并且可以用DateTime.civil(2009,9-1,-1,0)做你想做的事。为天

  9. ruby-on-rails - 协会的 Rails 索引 - 2

    我发现自己需要这个。假设cart是一个包含用户列表的模型。defindex_of_itemcart.users.each_with_indexdo|u,i|ifu==current_userreturniendend获取此类关联索引的更简单方法是什么? 最佳答案 indexArray上的方法与您的index_of_item方法相同,例如cart.users.index(current_user)返回数组中第一个对象的索引==给obj。如果未找到匹配项,则返回nil。 关于ruby-on-

  10. ruby - Rails -- :id attribute? 所需的数据库索引 - 2

    因此,当我遵循MichaelHartl的RubyonRails教程时,我注意到在用户表中,我们为:email属性添加了一个唯一索引,以提高find的效率方法,因此它不会逐行搜索。到目前为止,我们一直在根据情况使用find_by_email和find_by_id进行搜索。然而,我们从未为:id属性设置索引。:id是否自动索引,因为它在默认情况下是唯一的并且本质上是顺序的?或者情况并非如此,我应该为:id搜索添加索引吗? 最佳答案 大多数数据库(包括sqlite,这是RoR中的默认数据库)会自动索引主键,对于RailsMigration

随机推荐