Nodejs MongoDB(2):修改使用

Nodejs MongoDB(2):修改使用

今天主要写有关更新操作的东西,前面第二篇已经有简单提过更新,今天主要讲更新,

补充: MongoDB默认监听端口是27170,但是MongoDB在启动服务的时候还会启动一个HTTP服务器,监听端口是28017,你可以通过”http://localhost:28017“ 来访问获取数据库管理信息,

当你用shell连接到某个数据库的时候,MongoDB服务器会自动将这个数据库连接赋值给全局变量db,这个变量是通过shell访问mongodb的主要入口,你可以通过直接运行db查看所指向的数据库,如下图: enter image description here

下面开始说明修改: 1.<b>save()</b> 前面有提到添加数据的方法save()和insert()两个方法,其实save()也有修改的作用,当使用save的时候如果存在就修改,如下图: enter image description here

2.<b>$set</b> $set用来指定一个键的值,如果这个键不存在的时候会自动创建,如下图给ruby添加时间: enter image description here

当然,如果觉得时间不对,可以再次修改,如图: enter image description here

或许你会觉得date类型不好,那我们可以把它换成字符串类型,如图: enter image description here

而且$set也可以修改内嵌文档这里就不演示了,如果你突然发现这个键不想要了怎么办呢,那就可以用$unset来删除,如图: enter image description here

3.<b>$inc</b> $inc可以用来增加或减少已有键的值,不存在时会自动创建一个键 假如我们给ruby这本书添加一个访问量,如下图: enter image description here

{"$inc":{“num”:1}}这里的1表示每次增加1,如果是10就每次增加10 现在我们让这本书每次访问一次我们累加50(不太公平),如图 enter image description here

如果我们给负值它就会减少,如图: enter image description here $inc的只能用于整数、长整数、双精度浮点数,如果用在其他类型上面会操作失败,

4.<b>$push</b> $push主要用于对数组的操作,不能用在整数、字符串上面, 如果指定的键存在,那么$push会向已有的数组末尾中加入一个元素,要是没有就自动创建一个新的数组,如下图给Ruby这本书添加评论: <b>db.book.article.update({“title”:“Ruby”}, {"$push":{“comments”:{“name”:“Jim”, “content”:“Good Book!”}}});</b>

接着在给一条评论: enter image description here

如果给数组添加值,我们可以使用$ne,如图: enter image description here

有时候可以使用另外一个$addToSet,比如我们给这个用户添加邮箱: enter image description here

5.<b>$pop</b> $pop删除数组中的数据,你可以把数组看做队列或栈,可以从任何一端删除,1表示从尾部删除,-1表示从头部删除,如图: enter image description here

6.<b>$pull</b> $pull可以基于特定条件来删除元素,$pull就可以做到,如下图: enter image description here

7.<b>upsert</b> upsert是一种特殊的更新,要是没有文档符合更新条件,就会依这个条件和更新文档为基础创建一个新的文档,如果找到了匹配的文档就正常更新,非常方便,可是怎么使用呢?前面有提过累加访问量的: <b>db.book.article.update({“title”,“Ruby”}, {"$inc":{“num”:1}});</b> 如果要使用upsert,只需要多添加一个参数而已: <b>db.book.article.update({“title”,“Ruby”}, {"$inc":{“num”:1}}, true);</b> 或许你会认为只是多个参数而已嘛,但是它这样会更高效,至于为什么高效这里就不说明了,

8.多文档更新 多文档更新是不是要用其他方法啊,不是,只要在update的第4个参数设置为true就可以了, <b>db.book.article.update({“title”,“Ruby”}, {"$inc":{“num”:1}}, true, true);</b> 默认是true,所以一般我们在使用的时候推荐显示表明是否需要,

到这里修改文档的大多数方法都写出来了,这些都要经常练习使用才能熟练,熟练了才能做到自己满足自己实际的需求,虽然Mongodb功能强大,尽量保持关系型数据库的众多特性,但是他并不是要具备所有的关系型数据库的功能,他尽可能地将服务端处理逻辑交给客户端(应用程序处理)),所以有时候特别复杂的功能可能他做不到,不过他这样精简的设计使得MongoDB获得了非常好的性能。

上面的演示例子中我的集合都是book.article、book.author,这种方式叫子集合, 子集合:组织集合的一种惯例是使用"."字符分开的按命名空间划分的子集合, 这样做的目的是为了使组织结构更明确,实际上book是不存在的(不需要存在),推荐使用子集合。 如果有写的不对的地方还请指出批评。


4 回复

Node.js MongoDB(2): 修改使用

今天我们继续探讨如何在Node.js中使用MongoDB进行数据的更新操作。前面的文章已经简单介绍了如何添加数据,今天我们重点讲解如何修改数据。

MongoDB监听端口

MongoDB默认监听端口是27017,同时在启动服务时还会启动一个HTTP服务器,监听端口是28017。可以通过http://localhost:28017来访问获取数据库管理信息。

当你通过shell连接到某个数据库时,MongoDB服务器会自动将该数据库连接赋值给全局变量db,你可以通过直接运行db来查看当前指向的数据库。

更新操作

1. 使用 save()

save() 方法不仅可以插入新数据,还可以在数据已存在的情况下进行更新。如果指定的文档存在,则会更新该文档;如果不存在,则会插入新文档。

const MongoClient = require('mongodb').MongoClient;

MongoClient.connect('mongodb://localhost:27017/mydatabase', (err, client) => {
    if (err) throw err;
    const db = client.db();
    const collection = db.collection('book');

    // 更新或插入文档
    collection.save({ title: 'Ruby' }, { name: 'John Doe' }, (err, result) => {
        if (err) throw err;
        console.log('Document updated or inserted');
        client.close();
    });
});

2. 使用 $set

$set 操作符用于指定一个键的值,如果该键不存在则会自动创建。

MongoClient.connect('mongodb://localhost:27017/mydatabase', (err, client) => {
    if (err) throw err;
    const db = client.db();
    const collection = db.collection('book');

    // 设置或更新键值
    collection.updateOne(
        { title: 'Ruby' },
        { $set: { publishedDate: new Date() } },
        (err, result) => {
            if (err) throw err;
            console.log('Document updated');
            client.close();
        }
    );
});

3. 使用 $inc

$inc 操作符用于增加或减少已有键的值,如果该键不存在则会自动创建。

MongoClient.connect('mongodb://localhost:27017/mydatabase', (err, client) => {
    if (err) throw err;
    const db = client.db();
    const collection = db.collection('book');

    // 增加访问量
    collection.updateOne(
        { title: 'Ruby' },
        { $inc: { views: 1 } },
        (err, result) => {
            if (err) throw err;
            console.log('Document updated');
            client.close();
        }
    );
});

4. 使用 $push

$push 主要用于对数组的操作,如果指定的键存在,则会向已有的数组末尾添加一个元素。

MongoClient.connect('mongodb://localhost:27017/mydatabase', (err, client) => {
    if (err) throw err;
    const db = client.db();
    const collection = db.collection('book');

    // 添加评论
    collection.updateOne(
        { title: 'Ruby' },
        { $push: { comments: { name: 'Jim', content: 'Good Book!' } } },
        (err, result) => {
            if (err) throw err;
            console.log('Comment added');
            client.close();
        }
    );
});

5. 使用 $pop

$pop 用于删除数组中的数据,1表示从尾部删除,-1表示从头部删除。

MongoClient.connect('mongodb://localhost:27017/mydatabase', (err, client) => {
    if (err) throw err;
    const db = client.db();
    const collection = db.collection('book');

    // 删除最后一个评论
    collection.updateOne(
        { title: 'Ruby' },
        { $pop: { comments: 1 } },
        (err, result) => {
            if (err) throw err;
            console.log('Last comment removed');
            client.close();
        }
    );
});

6. 使用 $pull

$pull 可以基于特定条件来删除数组中的元素。

MongoClient.connect('mongodb://localhost:27017/mydatabase', (err, client) => {
    if (err) throw err;
    const db = client.db();
    const collection = db.collection('book');

    // 删除特定条件的评论
    collection.updateOne(
        { title: 'Ruby' },
        { $pull: { comments: { name: 'Jim' } } },
        (err, result) => {
            if (err) throw err;
            console.log('Comments removed');
            client.close();
        }
    );
});

7. 使用 upsert

upsert 是一种特殊类型的更新,如果没有找到匹配的文档,则会根据更新条件和更新文档创建新的文档。

MongoClient.connect('mongodb://localhost:27017/mydatabase', (err, client) => {
    if (err) throw err;
    const db = client.db();
    const collection = db.collection('book');

    // 更新或插入
    collection.updateOne(
        { title: 'Ruby' },
        { $inc: { views: 1 } },
        { upsert: true },
        (err, result) => {
            if (err) throw err;
            console.log('Document updated or inserted');
            client.close();
        }
    );
});

8. 多文档更新

如果你想同时更新多个文档,可以在 update 方法的第四个参数中设置为 true

MongoClient.connect('mongodb://localhost:27017/mydatabase', (err, client) => {
    if (err) throw err;
    const db = client.db();
    const collection = db.collection('book');

    // 更新多个文档
    collection.updateMany(
        { title: { $regex: /R/ } },
        { $inc: { views: 1 } },
        (err, result) => {
            if (err) throw err;
            console.log(`${result.modifiedCount} documents updated`);
            client.close();
        }
    );
});

以上就是Node.js中使用MongoDB进行数据更新的一些常见操作。希望这些示例代码能帮助你更好地理解和应用这些更新操作。


唉,mongodb权威指南上都有的

辛苦了, 感谢~~~

以下是对“Nodejs MongoDB(2): 修改使用”的内容总结,并附带一些示例代码:

更新操作

1. 使用 save() 方法

save() 方法可以用于插入新文档或更新现有文档。如果文档已经存在,则进行更新;如果不存在,则插入。

const doc = { title: "Node.js", author: "John Doe", published: new Date() };
await db.collection('books').save(doc);

2. 使用 $set 操作符

$set 操作符用于修改指定键的值。如果该键不存在,则会自动创建。

await db.collection('books').updateOne(
    { title: "Node.js" }, 
    { $set: { author: "Jane Doe", publishDate: new Date() } }
);

3. 使用 $inc 操作符

$inc 操作符用于递增或递减字段的值。如果字段不存在,则会创建该字段。

await db.collection('books').updateOne(
    { title: "Node.js" }, 
    { $inc: { views: 1 } }
);

4. 使用 $push 操作符

$push 操作符用于向数组字段添加元素。如果字段不存在,则会创建一个数组。

await db.collection('books').updateOne(
    { title: "Node.js" },
    { $push: { comments: { name: "Jim", content: "Good book!" } } }
);

5. 使用 $pop 操作符

$pop 操作符用于从数组字段的开头或结尾删除元素。

// 删除第一个评论
await db.collection('books').updateOne(
    { title: "Node.js" },
    { $pop: { comments: -1 } }
);

// 删除最后一个评论
await db.collection('books').updateOne(
    { title: "Node.js" },
    { $pop: { comments: 1 } }
);

6. 使用 $pull 操作符

$pull 操作符用于基于特定条件删除数组中的元素。

await db.collection('books').updateOne(
    { title: "Node.js" },
    { $pull: { comments: { name: "Jim" } } }
);

7. 使用 upsert 参数

upsert 参数用于如果找不到匹配的文档,则创建一个新文档。

await db.collection('books').updateOne(
    { title: "Node.js" },
    { $set: { author: "Jane Doe" } },
    { upsert: true }
);

8. 多文档更新

通过设置 multi 参数为 true,可以更新多个文档。

await db.collection('books').updateMany(
    { author: "John Doe" },
    { $set: { author: "Jane Doe" } }
);

以上是MongoDB在Node.js中的一些基本更新操作示例。这些操作可以帮助你有效地管理和更新你的数据库文档。

回到顶部