8

I have a mongo object and wish to access it via mongoose for my web app. The schema I've defined has an Object storing user ids and a 3-level value (yes, maybe or no).

e.g.

"user_info": {
    "<id_value_1>": "y",
    "<id_value_2>": "n"
}

The id_value_*s above are the users session ids so a long string of random characters. How can I create a mongoose Schema for this?

  1. Would user_info: {String, String} work?

  2. I could restructure it so that the user_info is an array of objects { "sessionid": "<value>", "value: "y"}, which would be ok, is this the best option?

Simon Walker
  • 5,523
  • 6
  • 30
  • 32

4 Answers4

12

You'll be better off if you avoid dynamic keys in your schema and go with your second idea of:

user_info: [{sessionid: String, value: String}]

You can use the $ positional operator to update individual user_info array elements by sessionid.

JohnnyHK
  • 305,182
  • 66
  • 621
  • 471
  • Can you elaborate why it's better to avoid dynamic keys? Is it just because mongoose can't handle it? – ruX Aug 09 '16 at 11:54
  • 3
    @ruX You can't index dynamic keys, they're awkward to build queries for, you can't define a useful Mongoose schema for them... – JohnnyHK Aug 09 '16 at 14:29
4

You may try with Schema Type Mixed like this way

var user = new Schema({
   info:    [Schema.Types.Mixed]
 });

user.info = { any: { thing: 'i want' } };
user.markModified('info');

You can read more about it here

Isidro Martínez
  • 816
  • 7
  • 15
1

After testing the above, I found that defining the schema as user_info: { String: String } is a valid way to do this (option 1 specified in the question).

Simon Walker
  • 5,523
  • 6
  • 30
  • 32
  • I believe this option does not work, since I implemented this change the web app failed, so see the answer from @JohnnyHK – Simon Walker Jan 17 '13 at 20:20
0

You may define objects and arrays in your schema. You may even combine them. For example, this is an array of objects:

var user = new Schema({
    foo: [ {
        address: {type: String},
        email: {type: String, unique: true}
    }],
    bar: [ "simple", "array" ]
});
randunel
  • 8,917
  • 1
  • 26
  • 24
  • 2
    My question was related to the fact that the key does not have a simple name like 'address', rather the key is generated in the code, but yes this is a valid way as per part 2. of my question – Simon Walker Jan 07 '13 at 13:39