2017-10-09 124 views
0

我是新來的MongoDB,我有以下MongoDB的JSON結構,插入問題在Json數組對象與Nodejs的對象mongodb?

{ 
    "_id" : ObjectId("59d62452a164b51d64b714c2"), 
    "folderName" : "Avinash 1234", 
    "tag" : "search", 
    "ismainFolder" : true, 
    "innerFolder" : [ 
     { 
      "ismainFolder" : false, 
      "foldername" : "Test12", 
      "_id" : ObjectId("59d72246e66adf2cfcfdd6e6") 
     } 
    ], 
    "innerFiles" : [ 
     { 
      "filelocation" : "", 
      "isFolder" : false, 
      "filename" : "Penguins.jpg", 
      "_id" : ObjectId("59d7223de66adf2cfcfdd6e5") 
     }, 
     { 
      "filelocation" : "", 
      "isFolder" : false, 
      "filename" : "Desert.jpg", 
      "_id" : ObjectId("59d72ff4e66adf2cfcfdd6ec") 
     }, 
     { 
      "filelocation" : "", 
      "isFolder" : false, 
      "filename" : "Hydrangeas.jpg", 
      "_id" : ObjectId("59d731dfe66adf2cfcfdd6ed") 
     }, 
     { 
      "filelocation" : "", 
      "isFolder" : false, 
      "filename" : "Chrysanthemum.jpg", 
      "_id" : ObjectId("59d73252e66adf2cfcfdd6ee") 
     } 

    ], 
    "__v" : 0 
} 

對於innerFiles陣列我需要插入取決於ID標籤欄( 「_id」:物件( 「59d7223de66adf2cfcfdd6e5」))。我使用了下面的nodeJs代碼,但它添加爲一個新的對象。請給我解決方案。

exports.addTagForSearch = function (req, res, next) { 
    var tagDetails = req.body.tagDetails; 
    console.log("tagDetails", tagDetails); 
    console.log("tagDetails", tagDetails._id); 
    Repository.find({ _id: tagDetails._id, }, { innerFiles: { $elemMatch: { _id: tagDetails._id } } },function (err, response) { 
     $push: { 
       innerFiles: { 
        "tagName": tagDetails.tagname, 
        } 
      //"filelocation": tagDetails.filelocation 
     } 

    }, { upsert: true, new: true }, function (err, post) { 
     if (err) return next(err); 
     return res.status(200).json("success"); 
    }); 
} 

但上面的代碼插入爲一個新的對象,請給我解決方案,請。

+1

爲什麼這個問題用'PHP'標記? – Twinfriends

+0

檢查它我添加了新的答案... –

回答

1

首先我需要爲我有一個config.js文件創建一個數據庫。下面是代碼

module.exports = { 
    'secretKey': '12345-67890-09876-54321', 
    'mongoUrl' : 'mongodb://localhost:27017/innerFiles' 
} 

接下來創建一個models文件夾,並保持這個order.js

// grab the things we need 
var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var folderSchema=new Schema({ 

    ismainFolder:{ 
     type:String, 
     //required:true, 
     default:'' 
    }, 
foldername:{ 
     type:String, 
     //required:true, 
     default:'' 
    } 

}); 

var innerSchema=new Schema({ 

    filelocation:{ 
     type:String, 
     //required:true, 
     default:'' 
    }, 
    isFolder:{ 
     type:String, 
     //required:true, 
     default:'' 
    }, 
    filename:{ 
     type:String, 
     //required:true, 
     default:'' 
    } 

}); 

var main= new Schema({ 
folderName:{type:String}, 
tag:{type:String}, 
ismainFolder:{type:String}, 
    innerFolder:[folderSchema], 
    innerFiles:[innerSchema] 

},{ strict: false }); 



var Order= mongoose.model('main', main); 

// make this available to our Node applications 
module.exports = Order; 

下一頁創建routes文件夾,並保持這種orderRouter.js文件中它

var express = require('express'); 
var bodyParser = require('body-parser'); 
var mongoose = require('mongoose'); 

var Orders = require('../models/orders'); 
var app = express(); 

var orderRouter = express.Router(); 
orderRouter.use(bodyParser.json()); 

orderRouter.get('/get',function (req, res, next) { 
    Orders.find({}, function (err, order) { 
     if (err) throw err; 
     res.json(order); 
    }); 
}) 

orderRouter.post('/post',function (req, res, next) { 
    Orders.create(req.body, function (err, order) { 
     if (err) { 
      res.status(400).send('Bad request'); 
     } 
     else{ 
     console.log('order created!'); 
     var id = order._id; 

     res.writeHead(200, { 
      'Content-Type': 'text/plain' 
     }); 
     res.end('Added the order with id: ' + id); 
     } 
    }); 
}) 

orderRouter.get('/:orderId',function (req, res, next) { 
    Orders.findById(req.params.orderId, function (err, order) { 
     if (err) { 
      res.status(404).send('OrderId not found'); 
     } 
     else{ 
     res.json(order); 
     } 
    }); 
}) 

orderRouter.put('/addingField',function(req,res){ 
      //var tagDetails = req.body; 
      console.log("tagDetails:"+req.body.subId); 
      console.log("tagname:"+req.body.tagname); 
Orders.update(
{_id:req.body.mainId,'innerFiles._id':req.body.subId}, 
{$set:{'innerFiles.$.tagName':req.body.tagname}}, 
function (err, article) { 
    if (err) return console.log(err); 
    res.json(article); 
}); 
}); 

app.use('/orders',orderRouter); 
app.use(express.static(__dirname+'/public')); 
module.exports = orderRouter; 

下一頁創建一個app.js文件這是服務器代碼

var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var mongoose = require('mongoose'); 
var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 

var config = require('./config'); 

mongoose.connect(config.mongoUrl); 
var db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function() { 
    // we're connected! 
    console.log("Connected correctly to server"); 
}); 
var orderRouter = require('./routes/orderRouter'); 
var app = express(); 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'jade'); 
// uncomment after placing your favicon in /public 
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 

app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 

// passport config 

app.use(passport.initialize()); 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use('/orders',orderRouter); 


// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handlers 
// development error handler 
// will print stacktrace 
if (app.get('env') === 'development') { 
    app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.json({ 
     message: err.message, 
     error: err 
    }); 
    }); 
} 

// production error handler 
// no stacktraces leaked to user 
app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.json({ 
    message: err.message, 
    error: {} 
    }); 
}); 
app.listen(3000,function(){ 
console.log("Server listening on 3000"); 
}); 
module.exports = app; 

並運行服務器node app.js。你可以post數據http://localhost:3000/orders/post你需要使用post method.Here使用這個API是樣本輸入例如張貼

{ 
    "folderName" : "Avinash 1234", 
    "tag" : "search", 
    "ismainFolder" : "true", 
    "innerFolder" : [ 
     { 
      "ismainFolder" : "false", 
      "foldername" : "Test12" 

     } 
    ], 
    "innerFiles" : [ 

     { 
      "filelocation" : "a", 
      "isFolder" : "false", 
      "filename" : "Penguins.jpg" 

     }, 
     { 
      "filelocation" : "b", 
      "isFolder" : "false", 
      "filename" : "Desert.jpg" 

     }, 
     { 
      "filelocation" : "c", 
      "isFolder" : "false", 
      "filename" : "Hydrangeas.jpg" 

     }, 
     { 
      "filelocation" : "d", 
      "isFolder" : "false", 
      "filename" : "Chrysanthemum.jpg" 

     } 

    ] 

} 

這裏是它的圖像

enter image description here

發佈後的數據檢查您的數據存儲在數據庫或not.Here無論ID我GI ving作爲迴應是mainId。對於這個運行這個API http://localhost:3000/orders/get使用get方法。收集子文檔ID是subId我們code.Sample圖片爲獲得

enter image description here

這以後這裏將是一個新的領域,以子文件對於使用此API http://localhost:3000/orders/addingField的任務,你需要使用對於this.Here put方法是輸入例子

{ 
"mainId":"59dca6aff968a98478aaaa96", 
"subId":"59dca6aff968a98478aaaa9a", 
"tagname":"hello" 
} 

和形象它

enter image description here

所有這些步驟完成後入住db.Here是 它 enter image description here

這就是它的樣本圖像。希望能幫助到你。

+0

謝謝你,它的工作正常。 –

+0

我很高興...檢查代碼並觀察路由中的每條線路...... –

+0

是的,我收到了代碼並感謝您的幫助。它的工作正常。 –