我是MongoDB的新手(上周才开始兴趣)。我试图找出一些东西,但我并不完全确定要搜索它的术语。所以我决定提出一个问题。
我创建了一个名为(77.164230,33.187725|77.164188,33.188013|77.164066,33.188336|77.164457,33.188676|77.164685,33.188861|77.165012,33.189296|77.165467,33.188591|77.165490,33.188213|77.165085,33.188057|77.164811,33.187902|77.164230,33.187725)
的集合。 Students
包含字段Students
,id
,name
(布尔值),undergrad
(数组)和classes
(这是学生班级数的3倍。
现在,我想知道如何在units
的特定字段上执行操作。我所做的是,插入了几个文档,故意不包括Students
字段。我希望units
$set
字段为每个没有该字段的文档/学生。我做了以下事情:
units
问题1:我做的甚至是远程正确的吗?
问题2:在设置var studentDoc = db.students.find({units: {$exists:false}})
studentDoc.forEach(function(stu){
db.student.update({_id:stu._id}, {$set:{units:{$size:"$classes"}}})
}
)
后输入studentDoc
时,它不会打印任何内容。但是当我写作
var studentDoc
它将var studentDoc = db.students.find({units:{$exists:false}}).toArray()
打印为数组但仍然无法在studentDoc
循环中执行任何操作。
问题3:我如何forEach
$set
字段为3 *(类数组的大小)
我希望我的问题清楚。我曾尝试搜索MongoDB文档和google,但没有运气(可能是因为我缺乏搜索正确内容的知识)。
任何帮助都会很棒!你甚至可以指出我正确的方向,这将是伟大的!
提前感谢您的帮助!!
答案 0 :(得分:1)
我不确定为什么foreach没有进入。你可以用下面的工作代码做同样的事情。
for(i=0;i<studentDoc.length();i++){
var stud_id = studentDoc[i]._id;
var doc = db.students.findOne({"_id":stud_id})["classes"];
if(doc){
var len = doc.length;
db.students.update({"_id":stud_id},{$set:{"units":len*3}})
}
}
据我所知,你不能在update语句中使用$ size:“$”查询。你会得到如下错误:
The dollar ($) prefixed field '$size' in 'units.$size' is not valid for storage.
答案 1 :(得分:1)
db.collection.find()
的返回值是游标。
在mongo shell中,如果使用
var
关键字将返回的光标不分配给变量,则光标自动迭代为20次访问最多匹配查询的前20个文档。若要手动迭代,请使用var
关键字将返回的光标分配给变量。所以
var studentDoc = db.students.find({units: {$exists:false}})
你应该手动迭代studentDoc
。
然而,
cursor.toArray()
返回一个包含游标中所有文档的数组。该方法完全迭代光标,将所有文档加载到RAM中并耗尽光标。因此
var studentDoc = db.students.find({units:{$exists:false}}).toArray()
它将studentDoc打印为数组。
如果您想使用forEach
,请cursor.forEach()
。
db.students.find({units:{$exists:false}}).forEach()
答案 2 :(得分:1)
var studentDoc = db.students.find({units: {$exists:false}})
这里studentDoc是一个光标,它不可打印。
你可以使用forEach
studentDoc.forEach(printjson);
或迭代光标
while (studentDoc.hasNext()) {
printjson(studentDoc.next());
}