gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:12:23 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com