How to pass the entire data in databese to an array in node js (using mongoose)
Model.find({}) should be your answer. It is an asynchronous function so use async/await or a callback.
e.g
await User.find({})
OUTPUT:
[
{
age: 0,
_id: 62ae10acd37b5a38cfc089b7,
name: 'john mclain',
email: 'example#gmail.com',
password: '',
tokens: [ [Object] ],
createdAt: 2022-06-18T17:51:40.895Z,
updatedAt: 2022-06-18T17:51:40.936Z,
__v: 1
},
{
age: 1,
_id: 62ae10acd37b5a38cfc089b7,
name: 'john mclain2',
email: 'example#gmail.com',
password: '',
tokens: [ [Object] ],
createdAt: 2022-06-18T17:51:40.895Z,
updatedAt: 2022-06-18T17:51:40.936Z,
__v: 2
}
]
There is a mongodb collection called orders
[
{
_id: ObjectId('626101f10709bfd705ebaaff'),
firstName: 'Peter',
lastName: 'Parker',
source: ObjectId('625fa062cc69b9ccda60ff4b')
},
{
_id: ObjectId('6229b108fb9da9e4ee29dcc4'),
firstName: 'Oliver',
lastName: 'Williams',
source: 'Instagram'
},
...
]
When I make a populate request for a collection of orders on the source field
const orders = await Order.find({}).populate('source');
It returns fields with the ObjectId type, that is, it is populated, but does not return with the string type
[
{
_id: ObjectId('626101f10709bfd705ebaaff'),
firstName: 'Peter',
lastName: 'Parker',
source: {_id: '625fa062cc69b9ccda60ff4b', name: 'Twitter'}
},
{
_id: ObjectId('6229b108fb9da9e4ee29dcc4'),
firstName: 'Oliver',
lastName: 'Williams'
},
...
]
How to make source fields with string type not deleted when request is answered
I want this result
[
{
_id: ObjectId('626101f10709bfd705ebaaff'),
firstName: 'Peter',
lastName: 'Parker',
source: {_id: '625fa062cc69b9ccda60ff4b', name: 'Twitter'}
},
{
_id: ObjectId('6229b108fb9da9e4ee29dcc4'),
firstName: 'Oliver',
lastName: 'Williams',
source: 'Instagram'
},
...
]
Please help, thanks in advance!!!
I want to save data to database but i dont know how to do it in this case.
userModel.js
const userSchema = new mongoose.Schema({
email: {
type: String,
unique: true
},
password: String,
passwordResetToken: String,
passwordResetExpires: Date,
profile: {
firstname: String,
lastname: String,
gender: String,
status: String,
location: String,
website: String,
picture: String
}
});
Signup.js
const user = new User({
firstname: req.body.firstname,
lastname: req.body.lastname,
location: req.body.location,
status: 0,
email: req.body.email,
password: req.body.password
});
Problem is that those things in profile wont save and i dont know how to edit that signup.js to make it work. Something like profile.firstname: req.body.firstname does not work.
const user = new User({
profile: {
firstname: req.body.firstname,
lastname: req.body.lastname,
location: req.body.location,
status: 0,
},
email: req.body.email,
password: req.body.password
});
From schema (userModel.js), we need update with profile structure
You need to save like this in signUp.js
const user = new User({
profile :{
firstname: req.body.firstname,
lastname: req.body.lastname,
location: req.body.location,
status: 0
},
email: req.body.email,
password: req.body.password
});
As firstname, lastname, location and status are part of the profile object.
I am unable to solve this issue (and looking to avoid loop update one by one), please hep me out here.
I have a fambio document (which has its own FamilyModel) which gets created after user gives his below information:
{
name: 'john',
lname: 'doe',
}
Now, after above information gets saved, user provides more information about the family after some processing in backend:
let familyArr = [
{ _id: 1234, name: 'Jenny', lname: 'doe', relation: 'mother' },
{ _id: 2345, name: 'Jawn', lname: 'doe', relation: 'father' },
{ _id: 3456, name: 'Jane', lname: 'doe', relation: 'sister' },
{ _id: 4567, name: 'Daisy', lname: 'wick', relation: 'pupper' }
]
Altogether, FamilyModel schema looks like:
const FamilyModel = mongoose.Schema({
name: {type: String, required: true},
lname: {type: String, required: true},
family: [relationshipSchema]
}, {
timestamp: true
});
const relationshipSchema = mongoose.Schema({
name: {type: String, required: true},
lname: {type: String, required: true},
relation: {type: String, required: true}
}, {
required: false,
timestamp: true
});
Now, John has an array of objects of family (filed type Array) and trying to insert that Array of Object like this:
What I tried multiple options:
db.fambio.updateOne({_id: 1111}, { $set: { family: familyArr }})
db.fambio.findOneAndUpdate({_id: 1111}, { $push: { family: familyArr }});
db.fambio.update({_id: 1111}, $addToSet: { 'family': familyArr}});
Nothing is working with respect to insert the constructed Object directly to the field. When I insert one at a time, it gets updated.
How am I supposed to write the query to update/append an Array of Objects in to a field of Array Type having its own Schema maintained.
Okay, I've solved it. How I solved it:
Initially, I saved the document and did some processing on the info as per my requirements post which I wanted to insert Array of Elements in to an Array key field where I was running in to the issue of nothing getting inserted. What I was missing was $each and this is how I did it:
db.getCollection('fambio').update({
_id: johnsuserid
}, {
$push: {
'family': {
$each:[
{ _id: 1234, name: 'Jenny', lname: 'doe', relation: 'mother' },
{ _id: 2345, name: 'Jawn', lname: 'doe', relation: 'father' },
{ _id: 3456, name: 'Jane', lname: 'doe', relation: 'sister' },
{ _id: 4567, name: 'Daisy', lname: 'wick', relation: 'pupper' }
]
}
}
});
Thank you everyone!! Hope this helps someone who may face this problem in future.
Sails.js .10 rc8
I've completely run out of ideas for this
I have a model called User and I want to associate it in a collection to other users like a friends list. Like a many-to-many association
//User.js
friends: {
collection: 'user',
via: 'friends'
}
but when I run
.populate('friends')
it doesn't populate anything. Any ideas?
I find that the best way to implement this is actually adding a reference to the id.
Check this User model:
module.exports = {
attributes: {
name: {
type: 'string',
required: true,
minLength: 2
},
email: {
type: 'email',
required: true,
unique: true
},
friends: {
collection: 'user',
via: 'id'
}
}
};
Now, if you run sails console you can test the following commands:
User.create({name:'test',email:'test#test.com'}).exec(console.log);
It returns:
{ name: 'test',
email: 'test#test.com',
createdAt: '2016-12-01T22:06:19.723Z',
updatedAt: '2016-12-01T22:06:19.723Z',
id: 1 }
You created your first user. Lets create some other ones:
User.create({name:'test2',email:'test2#test.com'}).exec(console.log);
Resulting in:
{ name: 'test2',
email: 'test2#test.com',
createdAt: '2016-12-01T22:06:40.808Z',
updatedAt: '2016-12-01T22:06:40.808Z',
id: 2 }
Let's see what we have so far:
User.find().populate('friends').exec(console.log);
[ { friends: [],
name: 'test',
email: 'test#test.com',
createdAt: '2016-12-01T22:06:19.723Z',
updatedAt: '2016-12-01T22:06:19.723Z',
id: 1 },
{ friends: [],
name: 'test2',
email: 'test2#test.com',
createdAt: '2016-12-01T22:06:40.808Z',
updatedAt: '2016-12-01T22:06:40.808Z',
id: 2 } ]
Now, let's create a user with a friend, using the reference to the first user. Notice that I just pass a single id, not an array:
User.create({name:'test3',email:'test3#test.com', friends:1}).exec(console.log);
Now, the result is this one. Notice that "friends" does not appear. This is by design.
{ name: 'test3',
email: 'test3#test.com',
createdAt: '2016-12-01T22:07:34.988Z',
updatedAt: '2016-12-01T22:07:34.994Z',
id: 3 }
Let's do a find with populate to see the current status:
User.find().populate('friends').exec(console.log);
Now we see that the third user has friends. The others have an empty array.
[ { friends: [],
name: 'test',
email: 'test#test.com',
createdAt: '2016-12-01T22:06:19.723Z',
updatedAt: '2016-12-01T22:06:19.723Z',
id: 1 },
{ friends: [],
name: 'test2',
email: 'test2#test.com',
createdAt: '2016-12-01T22:06:40.808Z',
updatedAt: '2016-12-01T22:06:40.808Z',
id: 2 },
{ friends:
[ { name: 'test',
email: 'test#test.com',
createdAt: '2016-12-01T22:06:19.723Z',
updatedAt: '2016-12-01T22:06:19.723Z',
id: 1 } ],
name: 'test3',
email: 'test3#test.com',
createdAt: '2016-12-01T22:07:34.988Z',
updatedAt: '2016-12-01T22:07:34.994Z',
id: 3 } ]
Let's create a fourth one, this time with two friends:
User.create({name:'test4',email:'test4#test.com', friends:[1,2]}).exec(console.log);
Resulting in (again, no friends property):
{ name: 'test4',
email: 'test4#test.com',
createdAt: '2016-12-01T22:07:50.539Z',
updatedAt: '2016-12-01T22:07:50.542Z',
id: 4 }
This time, we passed an array of ids to friends. Let's see the current status:
User.find().populate('friends').exec(console.log);
[ { friends: [],
name: 'test',
email: 'test#test.com',
createdAt: '2016-12-01T22:06:19.723Z',
updatedAt: '2016-12-01T22:06:19.723Z',
id: 1 },
{ friends: [],
name: 'test2',
email: 'test2#test.com',
createdAt: '2016-12-01T22:06:40.808Z',
updatedAt: '2016-12-01T22:06:40.808Z',
id: 2 },
{ friends:
[ { name: 'test',
email: 'test#test.com',
createdAt: '2016-12-01T22:06:19.723Z',
updatedAt: '2016-12-01T22:06:19.723Z',
id: 1 } ],
name: 'test3',
email: 'test3#test.com',
createdAt: '2016-12-01T22:07:34.988Z',
updatedAt: '2016-12-01T22:07:34.994Z',
id: 3 },
{ friends:
[ { name: 'test',
email: 'test#test.com',
createdAt: '2016-12-01T22:06:19.723Z',
updatedAt: '2016-12-01T22:06:19.723Z',
id: 1 },
{ name: 'test2',
email: 'test2#test.com',
createdAt: '2016-12-01T22:06:40.808Z',
updatedAt: '2016-12-01T22:06:40.808Z',
id: 2 } ],
name: 'test4',
email: 'test4#test.com',
createdAt: '2016-12-01T22:07:50.539Z',
updatedAt: '2016-12-01T22:07:50.542Z',
id: 4 } ]
Now, how do you add a friend to an existing user? It's somehow odd: you have to first find the user, then use the add function on the resulting model, and then, save it. In my day to day code, I have a helper function that does just that. So, here is the example:
User.findOne(1).populate('friends').exec(function(err,u){ u.friends.add(3);u.save(function(err){ if(err) console.error(err);});});
Now in the console we see no results.
Let's check the User content now:
User.find().populate('friends').exec(console.log);
[ { friends:
[ { name: 'test3',
email: 'test3#test.com',
createdAt: '2016-12-01T22:07:34.988Z',
updatedAt: '2016-12-01T22:07:34.994Z',
id: 3 } ],
name: 'test',
email: 'test#test.com',
createdAt: '2016-12-01T22:06:19.723Z',
updatedAt: '2016-12-01T22:09:41.410Z',
id: 1 },
{ friends: [],
name: 'test2',
email: 'test2#test.com',
createdAt: '2016-12-01T22:06:40.808Z',
updatedAt: '2016-12-01T22:06:40.808Z',
id: 2 },
{ friends:
[ { name: 'test',
email: 'test#test.com',
createdAt: '2016-12-01T22:06:19.723Z',
updatedAt: '2016-12-01T22:09:41.410Z',
id: 1 } ],
name: 'test3',
email: 'test3#test.com',
createdAt: '2016-12-01T22:07:34.988Z',
updatedAt: '2016-12-01T22:07:34.994Z',
id: 3 },
{ friends:
[ { name: 'test',
email: 'test#test.com',
createdAt: '2016-12-01T22:06:19.723Z',
updatedAt: '2016-12-01T22:09:41.410Z',
id: 1 },
{ name: 'test2',
email: 'test2#test.com',
createdAt: '2016-12-01T22:06:40.808Z',
updatedAt: '2016-12-01T22:06:40.808Z',
id: 2 } ],
name: 'test4',
email: 'test4#test.com',
createdAt: '2016-12-01T22:07:50.539Z',
updatedAt: '2016-12-01T22:07:50.542Z',
id: 4 } ]
With this method, you can even add the same user to the friends collection!
User.findOne(1).populate('friends').exec(function(err,u){ u.friends.add(1);u.save(function(err){ if(err) console.error(err);});});
Have fun!
Your models should look like this...
//User.js
friends: {
collection: 'friend',
via: 'user'
}
//Friend.js
user: {
model: 'user'
via: 'friends'
}
Also sails 10 rc8 is old. You should be on sails 10.5
You should use .populate('friends') instead of .populate(friends)
As it turns out, when you have a many to many association in waterline you have to declare one of the models as dominant. Since they are the same model, neither is dominated. While a join table is created, there is no way to populate it.