2017-10-09 219 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

是的,我收到了代码并感谢您的帮助。它的工作正常。 –