Collection is not getting created even after creating the model using mongoose - angularjs

I have created a model using mongoose.
However, it is not creating collection in mongodb.
My connection is working fine though to the mongodb
var mongoose = require("mongoose"),
Schema = mongoose.Schema,
ObjectId = Schema.ObjectId;
const conn = require('app/connection');
var notesSchema = new Schema({
_id: ObjectId,
message: String,
});
var dataSchema = new Schema({
_id: ObjectId,
dataId: String,
dataName: String,
notes: [notesSchema]
}, {
collection: 'dataCols'
});
var dataCol = conn.on('cg').model('dataCol', dataSchema);
I have also tried acting against the model (find, insert etc) but the collection is not created automatically.
I am connecting to a replica set

Related

Mongo db showing record after deleting

I have an Angular on the frontend with node on the backend, where I show user messages that a user can delete and edit.
When I am deleting a message I also remove all the records from the users array of messages, and on the frontend that works fine, no messages that were deleted show up, but when I check in the DB, for user records, there is still one recored in the messages array of a user.
So, when I do db.users.find()
I get for the user that has all messages deleted:
"messages" : [ ObjectId("58d921cacca7c04abd100344") ], "__v" : 9
This is the messages model where I pull the message record on delete from the DB.
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var User = require('./user');
var schema = new Schema({
content: {type: String, required: true},
user: {type: Schema.Types.ObjectId, ref: 'User'}
});
schema.post('remove', function (message) {
User.findById(message.user, function (err, user) {
user.messages.pull(message);
user.save();
});
});
module.exports = mongoose.model('Message', schema);
And this is the user model:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var mongooseUniqueValidator = require('mongoose-unique-validator');
var schema = new Schema({
firstName: {type: String, required: true},
lastName: {type: String, required: true},
password: {type: String, required: true},
email: {type: String, required: true, unique: true},
messages: [{type: Schema.Types.ObjectId, ref: 'Message'}]
});
schema.plugin(mongooseUniqueValidator);
module.exports = mongoose.model('User', schema);
When I check the messages collection, there are no messages there at all.
Though it works fine on the frontend, I wonder why is it still showing that record in the DB, when all the messages have been deleted for the user?

Mongoose doesn't create subdocument from JSON array

I'm trying to write a JSON object that contains both first-level data along with arrays into MongoDB.
What happens instead is all first-level data is stored, but anything contained in an array isn't. When logging the data the server receives, I see the entire object, which leads me to believe there's something wrong with my Mongoose code.
So for example if I send something like this:
issueId: "test1",
issueTitle: "testtest",
rows: [
{order:1,data: [object]},
{order:2,data: [object]},
]
Only the following gets stored:
issueId: "test1",
issueTitle: "testtest",
lastUpdated: Date,
I have the following model for Mongo:
//model.js
var mongoose = require('mongoose');
var model = mongoose.Schema({
issueId : String,
issueTitle : String,
lastUpdated : {type: Date, default : Date.now},
rows : [{
order : Number,
data : [
{
title : String,
text : String,
link : String,
}
]
}]
});
module.exports = mongoose.model('Model', model);
And the routing code, where I believe the problem likely is:
//routes.js
const mongoose = require('mongoose');
const Model = require('./model.js');
...
app.post('/api/data/update', function(req, res) {
let theData = req.body.dataToInsert;
console.log(JSON.stringify(theData,null,4));
Model.findOneAndUpdate(
{issueId : theData.issueId},
{theData},
{upsert: true},
function(err,doc){
if(err) throw err;
console.log(doc);
});
});
As well, here's the part of the Angular controller storing the data. I don't think there's any problem here.
pushToServer = function() {
$http.post('/api/data/update',{
dataToInsert : $scope.dataObject,
}).then(function successCallback(res){
console.log("all good", JSON.stringify(res,null,3));
}, function errorCallback(res){
console.log("arg" + res);
});
}
Look at the first question in the mongoose FAQ:
http://mongoosejs.com/docs/faq.html
Mongoose doesn't create getters/setters for array indexes; without them mongoose never gets notified of the change and so doesn't know to persist the new value. The work-around is to use MongooseArray#set available in Mongoose >= 3.2.0.
// query the document you want to update
// set the individual indexes you want to update
// save the document
doc.array.set(3, 'changed');
doc.save();
EDIT
I think this would work to update all of the rows. I'd be interested to know if it does work.
let rowQueries = [];
theData.rows.forEach(row => {
let query = Model.findOneAndUpdate({
issueId: theData.issueId,
'row._id': row._id
}, {
$set: {
'row.$': row
}
});
rowQueries.push(query.exec());
});
Promise.all(rowQueries).then(updatedDocs => {
// updated
});

Error adding array to MongoDB / Mongoose collection

I am trying to add an array to a Mongo document, and I'm getting the error "Cast to Array failed for value "[object Object],[object Object]" at path "vendors""
Here is my model:
module.exports = {
attributes: {
vendors: {
type: [String]
},
description: {
type: String
}
}
};
Here is my code to create:
var vendors = ko.observableArray(['foo','bar']);
var desc = ko.observable('yadda yadda yadda');
var dto = {
data: {
vendors: vendors(),
description: description()
}
};
DataService.quoteRequest.create(dto);
Musical Shore,
I'm not familiar with knockout.js, but in regards to Mongoose it doesn't look like you are defining your Schema and Model. You would need to do the following:
Define Schema
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var attributesSchema = new Schema({
vendors: [String],
description: String
});
Create a Model
var Attributes = mongoose.model('Attribute',attributesSchema);
Create and Save a Document
//create an attribute document
var attribute = new Attributes(
{
vendors: vendorsArray,
description: desc
}
);
attribute.save(function(err){
if(!err) console.log('Success');
}

Mongoose search data by object

I want to make a search in database by JSON objects.
Here is my schema:
var patientSchema = new Schema({
firstname: String,
lastname: String,
age: String,
tel: String,
work: [workSchema],
});
My angular js request, sends an JSON object which will be:
{'firstname':'value', 'lastname':'value', 'age':'age','tel':tel}
Is there a way to search for the matches directly in the Patient Schema?
so if the JSON object contains only firstname value .. it will check that
in MySQL I would do,
SELECT * FROM patients WHERE firstname LIKE '%'.json.firstname AND .....
what I've tested is
var filter = "{'firstname': 'value', 'lastname': 'value', 'age':'value', 'tel': 'tel'}" //sent from angularjs client
var jsonFilter = JSON.parse(filter);
Patient.find().or([
{ 'firstname': { $regex: new RegExp(filter.firstname,'i') }},
{ 'lastname': { $regex: new RegExp(filter.lastname,'i') }},
{ 'age':{ $regex: new RegExp(filter.age,'i') }},
{ 'tel':{$regex: new RegExp(filter.tel,'i') }}]).exec(function(err, result) {
if ( err)
throw err;
res.json(result);
});
this works fine but ALL the data should be filled if the attributes are empty it will return undefined which will not get me the right data. since Angular JS sends only the $scope.data.
Is there a way to get all the data by my JSON object, and not rewriting all the JSON fields, because I need to make bigger filters in this project?
I do not know if it is the best way to do this, but it is a start. I would loop over your keys and build your query dynamically. By looping over your keys, you can add as many keys as you want. For each key, push your new regex to your query variable. Finally, use your result as query.
Here is the code:
var filter = {'firstname': 'value', 'lastname': 'value', 'age':'value', 'tel': 'tel'};
var query = {$or: []};
var keys = Object.keys(filter);
for(var i=0;i<keys.length;i++) {
var item = {};
item[keys[i]] = new RegExp(filter[key], 'i');
query.$or.push(item);
}
Patient.find(query).exec(function(err, result) {
if ( err)
throw err;
res.json(result);
});

Mongoose schema array with extra ids [duplicate]

This question already has an answer here:
Why is an _id with ObjectID added to when using MongoDB's $push to add new object to an array?
(1 answer)
Closed 9 years ago.
I have the following Mongoose schema for a node js app I'm working on:
var memory = new schema({
date_added: Date,
name: String,
description: String,
personsInvolved: [{person: String}],
location: String,
uniqueness: Number,
category: String
});
It has an array field called personsInvolved that just has one field in it, person.
In my app, there's a form that takes a list of people, separated by a comma and it goes to a create function that takes that value and splits it on the commas into an array.
That part works, but it adds an _id field to each person in the array when I save the document into mongo. It looks like this:
personsInvolved:
[ { person: 'Test', _id: 52c6d6c2457e5ce02b00000b },
{ person: ' test2', _id: 52c6d6c2457e5ce02b00000c },
{ person: ' test3', _id: 52c6d6c2457e5ce02b00000d } ] }
Is there a way to make it so the _id field doesn't get added to each person? This is the code I'm using to save the record to mongo:
exports.create = function(req, res) {
// people are separated by a comma
var people = req.body.people;
var peopleArr = req.body.people.split(",");
var newMem = new memory();
newMem.date_added = Date.now();
newMem.name = req.body.name;
newMem.description = req.body.description;
for(var i in peopleArr) {
var name = {person: peopleArr[i]};
newMem.personsInvolved.push(name);
}
newMem.location = req.body.location;
newMem.uniqueness = req.body.uniqueness;
newMem.category = req.body.category;
console.log(newMem);
newMem.save(function(err, memory, count) {
res.redirect('/');
});
};
I'm only using personsInvolved as data, the persons in the array are not being used to identify with any other documents.
Make person a real schema model (as opposed to an anonymous object) and pass it {_id:false}.
http://mongoosejs.com/docs/subdocs.html

Resources