MongoDB Saving Sub Document - mongodb

I m newbie mongo and node.js.I m using MongoDB and I working on Todo list app.
https://github.com/ishuah91/Nodejs-MongoDb-TodoMVC
This is my todo model
function init(Schema, mongoose){
var TheSchema = new Schema({
title: String,
complete: Boolean
});
return mongoose.model('Todos', TheSchema);
}
module.exports.init = init;
But I want to do this model will be saved as in other document like sub-documemt.
var mainDoc = Schema({
name:String,
author: String,
receiver: String,
list: [TheSchema]
});

You would have to do the following :
var mainDoc = Schema({
name:String,
author: String,
receiver: String,
list: {
title: String,
complete: Boolean
}
});

Related

Mongoose distinct returns empty array

I have the following schema and query. I'm trying to retrieve all tags in my document by using the .distinct() method but that's not working. Any suggestions would be great.
const postingSchema = new mongoose.Schema({
time: String,
date: String,
company: String,
position: String,
description: String,
tags: Array,
});
router.get('/tags', async function(req, res){
const tags = await Postings.find({}).distinct("tags").exec();
if(!tags){
return res.status(404).json({message: "No Tags!"});
}
return res.status(200).json(tags);
}

How to find parent document?

This is my 2 schemas:
var activationTokenSchema = new Schema({
token: String,
});
var userSchema = new Schema({
name: String,
login: String,
email: String,
password: String,
balance: Number,
isActivated: Boolean,
activationToken: { type: Schema.Types.ObjectId, ref: 'ActivationToken' }
});
const User = mongoose.model('User', userSchema);
const ActivationToken = mongoose.model('ActivationToken', activationTokenSchema);
User is parent model, which has child model ActivationToken.
Having only token string, how can I find User document?
Or is it better to redesign ActivationTokenSchema and include userId there, so only child will be pointing to parent?

Mongodb: Not able to add new key in nested object

I have a schema in mongodb like
var schema = new mongoose.Schema({
agentCode: String,
data: {
type: Object,
profDtl: {
education: String
}
});
Now i want to add a new property desgnName in profDtl
var schema = new mongoose.Schema({
agentCode: String,
data: {
type: Object,
profDtl: {
desgnName: String, // trying to add new property
education: String
}
});
but it is not reflected in database
I got a solution for it, whenever add new property in mongodb schema, it required a default value to reflect on new entry
for Eg:
var schema = new mongoose.Schema({
agentCode: String,
data: {
type: Object,
profDtl: {
desgnName: {
type: String,
default: ""
},
education: String
}
});
now its working fine

Unable to query sub document mongoose

I've schema like this and i', trying to get the document from the array using _id. This is my first Mongo project that I'm working, please help me how can I achieve the. I basically want to retrieve the sub document corresponds to the id and update some data in that.
var PhoneSchema = new mongoose.Schema({
type: String,
number: String
});
var StudentSchema = new mongoose.Schema({
name: String,
dept: String,
phone: [PhoneSchema]
});
var Phone = mongoose.model('Phone',PhoneSchema);
var Student = mongoose.model('Student',StudentSchema);
I've tried the following ways, but none of them are working.
Method 1: When I tried the same in the console it is giving me the parent document along with the sub document that corresponds to the phoneId
Student.findOne({"phone._id":new mongoose.Schema.Types.ObjectId(phoneId) }, {'phone.$':1}, function(err, student) {
}
Method 2: As per the mongoose documentation to retrieve sub documents, in this case I'm getting exception saying phone is undefined
Student.phone.Id(phoneId);
I've fixed this by removing Schema from the below query
Student.findOne({"phone._id":new mongoose.Types.ObjectId(phoneId) }, {'phone.$':1}, function(err, student) {
}
i tried to solve your requirement. The following code did the job.
var PhoneSchema = new mongoose.Schema({
type: String,
number: String
});
var StudentSchema = new mongoose.Schema({
name: String,
dept: String,
phone: [PhoneSchema]
});
var Phone = mongoose.model('Phone',PhoneSchema);
var Student = mongoose.model('Student',StudentSchema);
var newPhone = new Phone({
type: 'ios', number: '9030204942'
});
var newStudent = new Student({
name:'Pankaj',
dept:'cse',
phone:newPhone
});
// newStudent.save(function(err, ph) {
// if (err) return console.error(err);
// });
Student.findOne({"phone._id":mongoose.Types.ObjectId('587e6409e06170ba1708dc21') },{_id:0,phone:1}, function(err, phone) {
if(err){
console.log(err)
}
console.log(phone);
});
Find the following screenshot with result

Storing values that aren't defined in the schema (dynamic schema?)

Suppose I have a Schema definition
var Users = mongoose.model('Users', new mongoose.Schema({
username: String,
salt: String,
hash: String,
facebook: {
id: String
}
}));
But I want to later
user = new Users({
username: 'myusername',
facebook: {
id: '3141592653',
displayName: 'mydisplayname' // <- wasn't in the schema ^
}
});
Then displayName simply doesn't gets stored. Is this not allowed in mongoose? Because I would imagine since MongoDB is "schema-less" there ought to be a way to do this?
You can disable the strict option on the schema to allow fields not in the schema to be saved:
var Users = mongoose.model('Users', new mongoose.Schema({
username: String,
salt: String,
hash: String,
facebook: {
id: String
}
}, { strict: false }));