getting empty array in mongoose by using mongoDB - node.js

var mongoose = require("mongoose")
var mongooseSchema = new mongoose.Schema({
empId: Number,
empName: String,
empId: Number
});
var Model = mongoose.model("employee", mongooseSchema);
mongoose.connect("mongodb://localhost/company");
Model.find(employeeDetails)
function employeeDetails(error, data) {
if (error == null) {
console.log(data);
} else {
console.log(error)
}
mongoose.disconnect();
}

var Model = mongoose.model("Model", mongooseSchema, "Employees");

Related

insert Json object from Yelp API [duplicate]

This question already has answers here:
Correct way to write loops for promise.
(13 answers)
JS wait for callback to finish inside a loop
(2 answers)
Closed 4 years ago.
I am trying to send data from Yelp API v3 to a Mongo database. I'm getting a response only issue is before it gets sent to the database it gets scrambled somewhere around :
var objects = businesesObject[i];
var newBusiness = Business();
This is what is saved to my database
{ _id: 5bf72505de908657e61ef900 }
{ _id: 5bf72505de9086727e619084 }
{ _id: 5bf7250e90849987841ef904 }
{ _id: 5bf72505de908427e6190847 }
{ _id: 5bf72505de908427e61ef999 }
{ _id: 5bf72505de908427e61ef90a }
{ _id: 5bf72505de908427567ef90c }
{ _id: 5bf72505de908427e61ef90e }
{ _id: 5bf72505de908423456ef910 }
{ _id: 5b567805de905427e61ef912 }
App.js
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var querystring = require('querystring');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var app = express();
require('./models/models');
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/Businesses', { useNewUrlParser: true });
var Business = mongoose.model('Business');
// mongoose.connection.once('open', function(){
// console.log('database is cconnected');
// }).on('error', function(error){
// console.log('connection error:', error);
// })
var Yelp = require('yelpv3');
var yelp = new Yelp({
apiKey: 'apikey'
});
// https://www.yelp.com/developers/documentation/v3/business_search
yelp.search({ term: 'food', location: 'California', radius:40000 })
.then(function (data) {
var businesesObject = data;
for(var i = 0; i< businesesObject.length;i++){
var objects = businesesObject[i];
var newBusiness = Business();
newBusiness.is_claimed = objects.is_claimed;
newBusiness.rating = objects.rating;
newBusiness.review_count = objects.review_count;
newBusiness.name = objects.objects;
newBusiness.url = objects.url;
newBusiness.categories = objects.categories;
newBusiness.phone = objects.phone;
newBusiness.image_url = objects.image_url;
newBusiness.display_phone = objects.display_phone;
newBusiness.id = objects.id;
newBusiness.location = objects.location;
// save the user
newBusiness.save(function(err) {
if (err){
console.log('Error in Saving user: '+err);
throw err;
}
});
}
console.log('Done saving to database.');
})
.catch(function (err) {
console.error(err);
});
module.exports = app;
model.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
// Defining a schema for Business
var businessSchema = new mongoose.Schema({
name: String,
image_url: String,
url: String,
review_count: String,
categories:Object,
rating : String,
coordinates: Object,
location: Object,
phone: String,
display_phone: String,
transactions: String,
is_claimed: Boolean,
id: String,
});
mongoose.model('Business', businessSchema);

Mongoose: Saving ref of another document into an array of objects document returns empty array

I'm trying to add specific document's ref id into another document's array of object. So that I can use populate method. But somehow the array remains empty even after pushing the ref.
Please help me. Thank you in advance.
Here is list.js:
const mongoose = require('mongoose');
const User = require('./user');
const Task = require('./task');
const Schema = mongoose.Schema;
// User Schema
const ListSchema = mongoose.Schema({
item:{
type: String,
required: true
},
purpose:{
type: String,
required: true
},
user: {
type: Schema.ObjectId,
ref:"User"
},
deadline:{
type: Date,
default: null
}
});
const List = module.exports = mongoose.model('List', ListSchema);
task.js:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const List = require('./list');
// User Schema
const TaskSchema = mongoose.Schema({
task:{
type: String,
required: true
},
list: [{
type: Schema.Types.ObjectId,
ref:'List'
}]
});
const Task = module.exports = mongoose.model('Task', TaskSchema);
Here is how I create and save new task instance:
const express = require('express');
const mongoose = require('mongoose');
const router = express.Router();
let List = require('../models/list');
let User = require('../models/user');
let Task = require('../models/task');
router.post('/add', isAuthenticated, function(req,res){
var tasker = req.body.task, listshash= [];
var startIndex = 0, index;
var x,y,listid= [];
while ((index = tasker.indexOf("#", startIndex)) > -1) {
var ind = tasker.indexOf(" ", index);
if(ind == -1)
listshash.push(tasker.substring(index+1));
else
listshash.push(tasker.substring(index+1,ind));
startIndex = index + 1;
}
//Instance of task
var taskIns = new Task({task: req.body.task});
List.find({user: req.session.passport.user}, function(err, lists){
for(x in lists){
for(y in listshash){
if(lists[x].item.toLowerCase().replace(/\s/g,'') == listshash[y]){
//lists[x] contains the document "list" that I want to store as
//ref in list property array of task
taskIns.list.push(lists[x]);
//console.log(taskIns.list.push(lists[x]));
}
}
}
});
taskIns.save(function(err, doc){
if(err) res.json(err);
else {
console.log("Saved");
res.redirect('/lists');
}
});
});
module.exports = router;
This is how the database collection of tasks look like after inserting data:
See the data
You should have to use async npm
List.find({user: req.session.passport.user}, function(err, lists){
async.each(lists ,function(x,callback){
async.each(listhash, function(y,callback){
if(x.item.toLowerCase().replace(/\s/g,'') == y){
taskIns.list.push(x);
}
});
});
//After that you can do save the data
taskIns.save(function(err, doc){
if(err) res.json(err);
else {
console.log("Saved");
res.redirect('/lists');
}
});
});
It's not saving the refs because you are dealing with asynchronous functions; you are pushing the lists within the find() callback and the taskIns model save event happens before the push.
You can move the taskIns save operation within the find() callback or use promises to tackle the issue.
For example, using callbacks:
List.find({ user: req.session.passport.user}, (err, lists) => {
const taskIns = new Task({task: req.body.task});
for(x in lists) {
for(y in listshash) {
if(lists[x].item.toLowerCase().replace(/\s/g,'') == listshash[y]) {
taskIns.list.push(lists[x]);
}
}
}
taskIns.save((err, doc) => {
if(err) res.json(err);
else {
console.log("Saved");
res.redirect('/lists');
}
});
});

populate query does not show newly added referenced item

My schema is as follows:
items.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ItemSchema = new Schema({
no_of_times_ordered:Number,
item_name:String,
item_tag:String,
item_category:String,
item_illustrations:[String],
item_stock:Number, //0 available 1 last 5 items 2 not available
item_quantity_ordered:{type:Number,default:0},
item_discount_price:Number,
item_price:Number,
item_img:String,
no_of_likes:{type:Number,default:0}
},{ versionKey: false });
module.exports = mongoose.model('items',ItemSchema);
foodtruck.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var Items = require('./items.js');
var FoodTruckSchema = new Schema({
foodtruck_name:String,
foodtruck_location:String,
foodtruck_rating:{type:Number,default:5},
foodtruck_total_votes:{type:Number,default:0},
foodtruck_tag:String,
foodtruck_open_status:{type:Number,default:1}, //0 open 1 closed
foodtruck_starting_timing:String,
foodtruck_closing_timing:String,
foodtruck_cusine:String,
foodtruck_img:String,
foodtruck_logo:String,
item_list: [ {type : mongoose.Schema.ObjectId, ref : 'items'}]
},{ versionKey: false });
module.exports = mongoose.model('foodtruck',FoodTruckSchema);
My query is as below:
var addItem = function(req, res) {
var foodtruck_id = req.body.foodtruck_id;
var newItem = new item();
var itemList = [];
newItem.item_name = req.body.item_name;
newItem.item_tag = req.body.item_tag;
newItem.item_category = req.body.item_category;
for (var key in req.body) {
if (req.body.hasOwnProperty(key)) {
if (key == 'item_illustrations') {
newItem.item_illustrations = req.body[key];
}
}
}
newItem.item_stock = req.body.item_status;
newItem.item_price = req.body.item_price;
if ((foodtruck_id) && (foodtruck_id.trim() != '')) {
foodtruck.findById(foodtruck_id.trim(), function(err, foodtrucks) {
if (err)
res.json({
status: '500',
message: 'There is no data available'
});
newItem.save(function(err, savedItem) {
if (!err) {
foodtrucks.item_list.push(savedItem._id);
foodtrucks.save();
foodtruck.find({
_id: foodtruck_id.trim()
}).populate('item_list').exec(function(err, foodtrucks) {
res.json({
status: '200',
message: 'New item added successfully',
data: foodtrucks
});
});
} else {
res.json({
status: '500',
message: 'Error while saving new item'
});
}
});
});
}
}
The main problem I am facing is that, I am able to create new item ,add its reference to the foodtruck schema, but somehow when I put populate query for the same foodtruck, the newly created item does not show. So,can you tell me how exactly I can show this item via populate query?
I think you got to put the populate inside the save function to make the populate method happen after the save.
foodtrucks.save(function(err, doc) {
//do population here
});
using asynchronous methods.

how to add referenced item in collection in mongoose

items.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ItemSchema = new Schema({
no_of_times_ordered:Number,
item_name:String,
item_tag:String,
item_category:String,
item_illustrations:[String],
item_stock:Number, //0 available 1 last 5 items 2 not available
item_quantity_ordered:{type:Number,default:0},
item_price:Number,
item_img:String,
no_of_likes:{type:Number,default:0}
},{ versionKey: false });
module.exports = mongoose.model('items',ItemSchema);
foodtruck.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var Items = require('./items.js');
var FoodTruckSchema = new Schema({
foodtruck_name:String,
foodtruck_location:String,
foodtruck_rating:{type:Number,default:5},
foodtruck_total_votes:{type:Number,default:0},
foodtruck_tag:String,
foodtruck_timing:String,
foodtruck_cusine:String,
foodtruck_img:String,
foodtruck_logo:String,
item_list: [ {type : mongoose.Schema.ObjectId, ref : 'items'}]
},{ versionKey: false });
module.exports = mongoose.model('foodtruck',FoodTruckSchema);
item_list_foodtruck.js
var addItem = function(req,res) {
var foodtruck_id = req.body.foodtruck_id;
var newItem = new item();
var itemList=[];
newItem.item_name = req.body.item_name;
newItem.item_tag = req.body.item_tag;
newItem.item_category = req.body.item_category;
for (var key in req.body) {
if (req.body.hasOwnProperty(key)) {
if(key =='item_illustrations'){
newItem.item_illustrations = req.body[key];
}
}
}
newItem.item_stock = req.body.item_status;
newItem.item_price = req.body.item_price;
if((foodtruck_id)&&(foodtruck_id.trim()!='')) {
foodtruck.findById(foodtruck_id.trim(),function (err, foodtrucks) {
if (err)
res.json({
status:'500',
message:'There is no data available'
});
newItem.save();
foodtrucks.item_list.push(newItem);
foodtrucks.save();
foodtruck.findById(foodtruck_id.trim()).populate('item_list').exec(function (err, foodtrucks) {
if (err) res.json({
status:'500',
message:'There is no data available'
});
res.send({
status:'200',
message:'Review List',
data:foodtrucks
});
});
});
}
else {
res.json({
status:'404',
message:'Please enter valid foodtruck id'
});
}
};
Here actually items is referenced document in foodtruck collection.so here items are added to items array, but somehow they are not updating their reference in foodtruck.item_list
.

Mongoose not returning document from mongo

I am trying to get Mongoose to query my mongo instance for a specific document (using the _id attribute). I currently have the following route:
router.get('/document/', function (req, res) {
var getDocuments = function (callback) {
var options = { server: { socketOptions: { keepAlive: 1000 } } };
var connectionString = 'mongodb://user:password#server:27017/db';
var pID = req.query.id;
pID = pID.trim();
console.log(pID);
var documentArray = [];
// Connected handler
Mongoose.connect(connectionString, function (err) {
var db = Mongoose.connection.useDb('db');
var pCollection = db.collection("collection");
//grab all items from pCollection
pCollection.find({ '_id': pID }, function (error, pDocument) {
if (error) {
console.log(error);
}
if (pDocument) {
// res.send(JSON.stringify(pDocument));
console.log(pDocument);
}
else {
console.log("nothing");
}
});
db.close();
});
};
getDocuments(function () {
});
});
The result returned is not a json document and does not seem to return a usable value. What am I doing wrong? Thanks for any help in advance!
EDIT:
I went back and changed the route to the following:
router.get('/document/', function (req, res) {
var pID = req.query.id;
pID = pID.trim();
console.log(pID);
Document.findById(pID, function (error, document) {
if (error) {
console.log(error);
}
else {
console.log(document);
}
});
});
I also created the following model:
var mongoose = require('mongoose');
var DocumentSchema = require('../schemas/documents');
var Document = mongoose.model('documents', DocumentSchema, 'Documents');
module.exports = Document;
And used the following schema:
var mongoose = require('mongoose');
var DocumentSchema = new mongoose.Schema({
documenttPK: String,
locationID: String,
docName: String,
SerialNumber: String,
documentID: String,
dateEntered: Date,
activeFlag: Boolean
});
module.exports = DocumentSchema;
My app.js makes a single call to a db file:
var mongoose = require('mongoose');
mongoose.connect('mongodb://user:password#server:27017/db');
But the result is still null. Is something wrong with the above code?

Resources