Fred J.
Fred J.

Reputation: 6019

returning embedded document from collection find

This Meteor code tries to return a cursor to the embedded documents referenced by the field data, then checks if it exists (because some times it does not exist in ActiveTaskCol) before returning this template helper method.

added later
The expected returned cursor will be used in the html {{#each data}} for more work hence the use of .find instead of .findOne.

The problem is that the if statement evaluates to true even though there is no data field in the ActiveTaskCol, I also tried obj.count() > 0 which also true even though "data" field does not exist in the collection.
How can I fix this? Thanks

Template.index.helpers({
    taskInputs: function () {
        var ready = Meteor.subscribe('inputsCol').ready();
        var data = InputsCol.find({});

        var selectedTask = Session.get('taskSelected');
        var obj = ActiveTaskCol.find({action: selectedTask}, {field: {data: 1}});
        if (typeof obj != 'undefined') {  //<-always true --------------
            return {items: obj};
        } else {
            return {items: data, ready: ready};
        }
    }
});

Upvotes: 0

Views: 45

Answers (1)

Kishor
Kishor

Reputation: 2677

It is always true because, you are using find, which returns a cursor. Instead, you should use findOne, so that, it will return document or undefined, if there is no such document. I also suggest, you use obj, which checks for falsy values like undefined, null, false instead of typeof obj != 'undefined'

Template.index.helpers({
    taskInputs: function () {
        var ready = Meteor.subscribe('inputsCol').ready();
        var data = InputsCol.find({});

        var selectedTask = Session.get('taskSelected');
        var obj = ActiveTaskCol.findOne({action: selectedTask}, {field: {data: 1}});
        if (obj) {  
            return {items: obj};
        } else {
            return {items: data, ready: ready};
        }
    }
});

Update: Based on your comments, you can use obj.count() to check whether there are documents matching your criteria.

Template.index.helpers({
    taskInputs: function () {
        var ready = Meteor.subscribe('inputsCol').ready();
        var data = InputsCol.find({});

        var selectedTask = Session.get('taskSelected');
        var obj = ActiveTaskCol.find({action: selectedTask}, {field: {data: 1}});
        if (obj.count() > 0) {  
            return {items: obj};
        } else {
            return {items: data, ready: ready};
        }
    }
});

Update 2

Template.index.helpers({
    taskInputs: function () {
        var ready = Meteor.subscribe('inputsCol').ready();
        var data = InputsCol.find({});

        var selectedTask = Session.get('taskSelected');
        var obj = ActiveTaskCol.find({
            action: selectedTask,
            data: { $exists: true }
        }, {
            field: {data: 1}
        });
        if (obj.count() > 0) {  
            return {items: obj};
        } else {
            return {items: data, ready: ready};
        }
    }
});

Upvotes: 1

Related Questions