MongoDB:对集合的字段执行操作

时间:2016-02-17 12:17:05

标签: mongodb mongodb-query

我是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包含字段Studentsidname(布尔值),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,但没有运气(可能是因为我缺乏搜索正确内容的知识)。

任何帮助都会很棒!你甚至可以指出我正确的方向,这将是伟大的!

提前感谢您的帮助!!

3 个答案:

答案 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());
}