2

I have a MongoDB collection with data that was not saved through my Derby app. I want to query against that and pull it into my Derby app.

So, I figured that out and here's the code to do it:

get '/:year', (page, model, params) ->
  query = model.query 'years', 
    where:
      year: (parseInt params.year, 10)
    limit: 1
  model.subscribe query, (err, year) ->
    if err
      console.log err

    page.render
      y: year.get(),
      year: params.year

The only problem is that the documents don't have a derby id, so it sets the MongoDB objectid (_id) to the derby id. Here's an example of the JSON that the model.get() returns: https://gist.github.com/0a5426d2b28a940e8803

I have no way of knowing what the objectid is before the query. I would love if the most recently returned id (currID) was in the object's top level so I could just query that and set a model reference. I built a hack to get around it for now, but it's not as smooth as I wish it would be. The code is below:

getId = (obj, year) ->
  for x of obj
    return obj[x].id if obj[x].year is year
  -1

Also, is there any way to update templates without destroying some templates already on the screen? Instead of doing a full page.render just doing a template.render?

Thanks

switz
  • 24,384
  • 25
  • 76
  • 101

2 Answers2

3

Racer queries were just updated in 0.3.11, and are described in this readme file: https://github.com/codeparty/racer/blob/master/lib/descriptor/query/README.md

switz
  • 24,384
  • 25
  • 76
  • 101
Nate Smith
  • 459
  • 4
  • 6
1

NOTE: This is no longer needed. The query system has been updated. Please see Nate's answer.

I spoke with the developer of DerbyJS (nateps) and he told me that they are working on improving the query system. It's still a work in progress.

For now, I've built a hack which will take an object to test against and an object of parameters

getId = (obj, params) ->
  ids = []
  for x of obj
    i = 0
    for y of params
      if obj[x][y] isnt params[y]
        break
      else if (++i is params.length)
        ids.push
          id: obj[x].id
  return ids

For example, you can input an object like such:

var obj = {
  "lskjfalksj23423": {
    id: "lskjfalksj23423",
    name: "random day",
    year: 2012,
    month: 12,
    day: 1
  },
  "aklsdjflkasdfd": {
    id: "aklsdjflkasdfd",
    name: "random day 2",
    year: 2012,
    month: 8,
    day: 1
  }
}

and then an object to test against (MAKE SURE TO ADD A LENGTH KEY)

var params = {
  month: 12,
  day: 1,
  length: 2
}

and it will return an array of the matching ids: [{id: "lskjfalksj23423"}]

Note: I haven't tested the example, so let me know if you're having problems with it. This should be obsolete in a few months anyway when the query system is built out further.

switz
  • 24,384
  • 25
  • 76
  • 101