Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么MongoDb游标可以像数组一样进行索引?_Javascript_Arrays_Mongodb - Fatal编程技术网

Javascript 为什么MongoDb游标可以像数组一样进行索引?

Javascript 为什么MongoDb游标可以像数组一样进行索引?,javascript,arrays,mongodb,Javascript,Arrays,Mongodb,我注意到,如果使用mongo命令执行JavaScript脚本,脚本可以将游标对象视为数组 var conn = new Mongo('localhost:27017'); var db = conn.getDB('learn'); db.test.remove({}); db.test.insert({foo: 'bar'}); var cur = db.test.find(); print(cur[0].foo); //prints: bar print(cur[1]); // print

我注意到,如果使用
mongo
命令执行JavaScript脚本,脚本可以将游标对象视为数组

var conn = new Mongo('localhost:27017');
var db = conn.getDB('learn');
db.test.remove({});
db.test.insert({foo: 'bar'});
var cur = db.test.find();
print(cur[0].foo);   //prints: bar
print(cur[1]); // prints: undefined
这似乎超出了JavaScript语言的能力,因为无法“重载下标操作符”。那么这实际上是如何工作的呢?

正如文档所说。它自动将
游标[0]
转换为
游标.toArray()[0]
。您可以通过使用print函数重写
toArray()
newerror().stack
来证明这一点。这是:

at DBQuery.a.toArray ((shell):1:32)
at DBQuery.arrayAccess (src/mongo/shell/query.js:290:17)
at (shell):1:2
如您所见,索引调用
arrayAccess
。怎么做,它调用
arrayAccess

v8::Handle<v8::Value> arrayAccess = info.This()->GetPrototype()->ToObject()->Get(
                v8::String::New("arrayAccess"));
...
v8::Handle<v8::Function> f = arrayAccess.As<v8::Function>();
...
return f->Call(info.This(), 1, argv);
。。。并将其注入JS游标类,该类最初在JS中定义

injectV8Function("DBQuery", DBQueryFT(), _global);

Tl;DR <强>:在Mango shell的C++源代码中被黑客攻击。如果访问的文档数超过了文档数,它将返回“undefined”,它可能不会操作运算符,但可以操作索引。因为它们只是属性的子集,所以它们可以是<代码>对象.defineProperty(游标'0',{get:…})@JonathanLonowski但如果没有“method missing”,则必须为每个索引定义一个运算符,这在这里似乎不实用。@user2864740不,这可能不适用于访问dt0xff提到的本机代码。但是,我主要是指出,在没有运算符重载的情况下定义类似数组的对象是可能的。@JonathanLonowski,事实并非如此。看看cursor类,这里我们没有类似的逻辑,这是我首先检查的,但是mongo这样做是愚蠢的。但在某些情况下,如果您试图模仿这种行为,它可能会很方便。
injectV8Function("DBQuery", DBQueryFT(), _global);