remove() 和 save() 在 mongodb 节点中是什么意思.js初始化一个数据库时



我最近使用node.js。我正在阅读一个应用程序的代码。下面的代码是初始化数据库,将一些问题加载到调查系统中,我无法理解这里的remove()和save()意味着什么。因为我找不到任何关于这两种方法的解释。似乎猫鼬在连接后就不用了。有人能解释一下这些方法的用法吗?

嗯,这是我对这段代码的理解,不一定是正确的。我的助教告诉我它应该在server.js之前运行。

/**
 *  This is a utility script for dropping the questions table, and then
 *  re-populating it with new questions.
 */
// connect to the database
var mongoose = require('mongoose');
var configDB = require('./config/database.js');
mongoose.connect(configDB.url);
// load the schema for entries in the 'questions' table
var Question = require('./app/models/questions');
// here are the questions we'll load into the database.  Field names don't
// quite match with the schema, but we'll be OK.
var questionlist = [
       /*some question*/
];
// drop all data, and if the drop succeeds, run the insertion callback
Question.remove({}, function(err) {
    // count successful inserts, and exit the process once the last insertion
    // finishes (or any insertion fails)
    var received = 0;
    for (var i = 0; i < questionlist.length; ++i) {
        var q = new Question();
        /*some detail about defining q neglected*/
        q.save(function(err, q) {
            if (err) {
                console.error(err);
                process.exit();
            }
            received++;
            if (received == questionlist.length)
                process.exit();
        });
    }
});

添加一些额外的细节,mongoose完全基于使用模式并使用这些模式来操作数据。在mongodb数据库中,有集合,每个集合保存不同类型的数据。当您使用mongoose时,幕后发生的事情是您使用映射到mongodb集合的每个不同的Schema。所以当你在猫鼬的土地上使用Question Schema时,在你使用的实际数据库的幕后确实有一些问题集合。您可能还拥有一个Users模式,它将作为数据库中某些用户集合的抽象,或者您可能拥有一个Products模式,它将再次映射到实际数据库中幕后的某些产品集合。

如前所述,在问题模式上调用remove({}, callback)时,您告诉mongoose在数据库中查找问题集合并删除符合特定标准的所有条目或文档(在mongodb中称为文档)。您可以在作为第一个参数传入的对象文本中指定该标准。因此,如果问题模式有一些布尔字段称为correct,而您想要删除所有不正确的问题,您可以使用Question.remove({ correct: false }, callback)。正如前面提到的,当将一个空对象传递给remove时,您告诉猫鼬删除Schema或集合中的所有文档。如果你不熟悉回调函数,基本上回调函数会说,嘿,完成这个异步操作后,继续做这个

这里使用的save()函数与官方mongodb驱动程序中使用的save()略有不同,这是我不喜欢mongoose的原因之一。但是解释一下,save在这里所做的就是创建这个新问题,由q变量指代,当你在这个问题对象上调用save()时,你是在告诉mongoose获取这个对象并将它作为一个新文档插入到后台的Questions集合中。这里的save表示插入到数据库中。如果您使用的是官方的mongo驱动程序,它将是db.getCollection('collectionName').insert({/* Object representing new document to insert */})

是的,你的助教是正确的。这段代码需要在server.js文件之前运行。无论您的服务器代码做什么,我假设它将连接到您的数据库。

我建议您查看mongoose API文档。从长远来看,官方的mongodb驱动程序可能是您最好的选择。

Mongoose基本上使用schema将您的MongoDB查询映射到JavaScript对象。

remove()接收一个选择器和回调函数。空选择器意味着所有的问题都将受到影响。

然后创建一个新的Question对象。我猜你遗漏了一些正在设置的数据。之后,它被保存回MongoDB。

你可以在官方文档中了解更多:http://mongoosejs.com/docs/api.html types-subdocument-js

remove query用于从集合中删除所有文档,save用于创建新文档。根据您的代码,似乎每次脚本运行时,它都会从问题集合中删除所有记录,然后从问题列表中保存问题的新记录。

最新更新