我正在处理一个简单的问题,即使用Node.js在Mongo数据库中插入一个集合。但是,我面临两个问题:
1.当我在.insert函数
(以下:albums.insert(a1, {safe: false}, cb);
和albums.insert(a2, {safe: false}, cb);
)中使用{safe:true}时,集合不会插入数据库中,也就是说,当我这样做时,它们不会在终端上打印console.log(doc)
(请参阅下文)的程序
2.程序本身不结束,我必须按CTRL + C结束它,即使它具有db.close()
在末端,我可以看到“这里”印刷是在终端上console.logged
之后db.close()
非常感谢任何帮助,谢谢!
var Db= require('mongodb').Db,
Connection= require('mongodb').Connection,
Server= require('mongodb').Server,
async= require('async');
var host= "localhost";
var port= Connection.DEFAULT_PORT;
var db= new Db("PhotoAlbums", new Server(host, port, {auto_reconnect: true,
poolSize: 20}), {w: 1});
var a1= {_id: "Travel", name: "Travel", title: "Travelogues", description:
"This was great", date: "1/1/2014"},
a2= {_id: "friends", name: "friends", title: "Friends", description:
"Random Pics", dat: "2/1/2014"};
var albums, photos;
async.waterfall([
function(cb)
{
db.collection("Albums", cb);
},
function (albums_coll, cb)
{
albums= albums_coll;
db.collection("Photos", cb);
},
function (photos_coll, cb)
{
photos= photos_coll;
albums.insert(a1, {safe: false}, cb);
},
function (doc, cb)
{
console.log("1. Successfully wrote ");
console.log(doc);
albums.insert(a2, {safe: false}, cb);
},
function (docs, cb)
{
console.log("2. Successfully wrote ");
console.log(docs);
cb(null);
},
], function(err, results)
{
if(err)
console.log("ERROR!");
db.close();
console.log("here");
});
本质上,您从未连接到数据库。该Db
对象需要.open()
调用该方法,并且所有交互都必须在该方法的提供的回调中或在“连接”事件处理程序中进行。
在某些概念中,您可能对这里有些不满意,我想让您直接理解。首先是修改后的清单:
var async = require('async'),
MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb://localhost/test',function(err,db) {
var a1 = {
"_id": "Travel",
"name": "Travel",
"title": "Travelogues",
"description": "This was great",
"date": new Date("2014/01/01")
},
a2 = {
"_id": "friends",
"name": "friends",
"title": "Friends",
"description": "Random Pics",
"date": new Date("2014/01/02")
};
var albums;
async.waterfall(
[
function(cb) {
db.collection("albums",cb);
},
function(albums_col,cb) {
albums = albums_col;
albums.insert(a1,cb);
},
function(doc,cb) {
console.log("1. Successfully wrote");
console.log(doc);
albums.insert(a2,cb);
},
function(doc,cb) {
console.log("2. Successfully wrote");
console.log(doc);
cb();
}
],
function(err,results) {
if (err) throw err;
db.close();
}
);
});
首先,您应该MongoClient
在新代码中使用。这是所有语言的标准实现。Server
如果需要,您仍然可以使用对象,但是连接字符串通常可以满足要求。交替:
MongoClient.connect( new Server(
"localhost",
Connection.DEFAULT_PORT,
{ "auto_reconnect": true }
{ w: 1 }
),function(err,db) {
{...}
});
另一部分是,我将删除默认情况下已设置的选项。更改连接池选项对于诸如此类的清单实际上并没有多大意义,但是5
驱动程序中已经内置了默认连接,而未指定此连接。也是“ WriteConcern”或{ w: 1 }
默认值。
其次,在为文档指定的结构中,使用实际日期对象。这些将作为BSON存储的“日期”类型序列化到MongoDB中,并且当作为真实日期对象读取时,它们也会返回到您的代码中。这就是您要处理的日期。否则,这些只是字符串,并不是很有用。
并不是为集合声明一个变量,而不是将参数传递给回调,但是为了简洁起见,不喜欢这样做。
请注意,此处省略{ safe: true }
了.insert()
方法的WriteConcern部分。除非您真的想覆盖已设置的连接设置(并且您几乎不希望这样做),否则您可能只想使用默认设置。“安全”选项也已弃用,因此您应该编写{ w: 0 }
等效的选项。
但最后要注意的是,如果您确实选择{ w: 0 }
了该选项,那么将不会返回所编写文档的预期“响应”。该值将被报告为null
即使已将其写入数据库。这是因为这种“不安全”的编写方式不需要数据库的任何确认。因此,您只是假设它已经存在,因此可能想要默认值{ w: 1 }
已经存在,这意味着它已得到确认。
然后输出如预期的那样:
1. Sccessfully wrote
[ { _id: 'Travel',
name: 'Travel',
title: 'Travelogues',
description: 'This was great',
date: Wed Jan 01 2014 00:00:00 GMT+1100 (AEDT) } ]
2. Sccessfully wrote
[ { _id: 'friends',
name: 'friends',
title: 'Friends',
description: 'Random Pics',
date: Thu Jan 02 2014 00:00:00 GMT+1100 (AEDT) } ]
当然,根据实际时区的不同,您需要使用字符串输出。还要指出的是形式new Date("2014/01/01")
和new Date("2014-01-01")
不相等。第一个将日期构造为UTC时区对象,第二个将日期构造为您的本地时区。MongoDB将存储一个UTC,因此最好确保对您存储的任何数据都以这种方式构成您的构造。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句