首页 > 解决方案 > 为什么mongodb使用employees[0]、employees[1]、employees[2]与使用employees[i]的for循环输出不同?

问题描述

这是我正在运行的查询:

var employees = db.worksOn.distinct("essn", { $or:[ {'hours': {$gt: 30}, 'pno': 1}, {'hours': {$lte: 20}, 'pno': 2}] }, {'essn': 1, '_id':0} );
for (var i = 0; i < employees.length; i++){
    db.employee.find( { 'ssn': employees[i] })
}

代码返回的内容:

{ "_id" : ObjectId("5fc80d0531819bcbd5c3a842"), "fname" : "Joyce", "minit" : "A", "lname" : "English", "ssn" : 453453453, "bdate" : "1962-07-31", "address" : "5631 Rice, Houston, TX", "sex" : "F", "salary" : 25000, "superssn" : 333445555, "dno" : 5 }

以下是各个部分返回的内容:

var employees = db.worksOn.distinct("essn", { $or:[ {'hours': {$gt: 30}, 'pno': 1}, {'hours': {$lte: 20}, 'pno': 2}] }, {'essn': 1, '_id':0} )
employees
[ 123456789, 333445555, 453453453 ]

_

employees.length
3

_

db.employee.find({'ssn': employees[0]})
{ "_id" : ObjectId("5fc80d0531819bcbd5c3a845"), "fname" : "John", "minit" : "B", "lname" : "Smith", "ssn" : 123456789, "bdate" : "1955-01-09", "address" : "731 Fondren, Houston, TX", "sex" : "M", "salary" : 30000, "superssn" : 333445555, "dno" : 5 }
> db.employee.find({'ssn': employees[1]})
{ "_id" : ObjectId("5fc80d0531819bcbd5c3a846"), "fname" : "Franklin", "minit" : "T", "lname" : "Wong", "ssn" : 333445555, "bdate" : "1945-12-08", "address" : "638 Voss, Houston, TX", "sex" : "M", "salary" : 40000, "superssn" : 888665555, "dno" : 5 }
> db.employee.find({'ssn': employees[2]})
{ "_id" : ObjectId("5fc80d0531819bcbd5c3a842"), "fname" : "Joyce", "minit" : "A", "lname" : "English", "ssn" : 453453453, "bdate" : "1962-07-31", "address" : "5631 Rice, Houston, TX", "sex" : "F", "salary" : 25000, "superssn" : 333445555, "dno" : 5 }

为什么使用employees[0]、employees[1]、employees[2]和employees[i]输出的结果不同?答案可能在这两段代码中找到:

for (var i = 0; i < employees.length; i++){ employees[i] }
453453453

for (var i = 0; i < employees.length; i++){ 
    print(employees[i]) 
}
123456789
333445555
453453453

标签: javascriptmongodbfor-loopmongodb-query

解决方案


为什么使用employees[0]、employees[1]、employees[2]和employees[i]输出的结果不同?

在这个find方法 ( db.employee.find( { 'ssn': employees[i] })) 中,结果是一个游标。请注意, afind总是返回一个游标并findOne返回一个文档(或 a null,如果没有找到匹配的文档)。游标对象可以有零个或多个文档,具体取决于查询过滤器和匹配的文档。

因此,在您的代码中,如果您想打印查询输出的结果db.employee.find( { 'ssn': employees[i] }),您需要遍历游标。例如,您可以在mongoshell 中执行此操作:

for (var i = 0; i < employees.length; i++){
    var empCur = db.employee.find({ 'ssn': employees[i] });
    empCur.forEach(printjson);
}

这将从empCur. Note cursor 有许多其他方法,您可以根据自己的用例使用其中的任何一种。

参考:


推荐阅读