[英]Mongo not working with nodejs
我正在處理一個簡單的問題,即使用Node.js在Mongo數據庫中插入集合。 但是我面臨兩個問題:
1.當我在.insert函數中使用{safe:true}時
(下面: albums.insert(a1, {safe: false}, cb);
和albums.insert(a2, {safe: false}, cb);
),則不console.log(doc)
集合插入數據庫中,即當我執行console.log(doc)
時,它們不會在終端上打印(請參閱下面的程序)
2.該程序本身並不會結束,即使它的末尾有db.close()
,我也必須按ctrl + c結束它,並且我可以看到在console.logged
終端上打印了“ here” 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中,並且在作為真實日期對象讀取時也將重新回到您的代碼中。 這就是您要處理的日期。 否則,這些只是字符串,並不是很有用。
並不是為集合聲明變量,而不是將參數傳遞給回調,但是為了簡潔起見,不喜歡這么做。
請注意, .insert()
方法的WriteConcern部分省略了{ safe: true }
。 除非您真的想覆蓋已設置的連接設置(並且您幾乎不希望這樣做),否則您可能只想使用默認設置。 還不建議使用“安全”選項,因此您應編寫等效的{ 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,因此最好確保以這種方式對您存儲的任何數據進行構造。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.