Fred J.
Fred J.

Reputation: 6029

when exists, return an embedded document which is inside a parent document

How can I return a cursor to the embedded document referenced by data only when it exists. The cursor is needed so that it could be used in a template {{#each data}}.

    var obj = ActiveTaskCol.find({action: selectedTask, data: {$exists:true}},{field: {data: 1}});

    if (obj.count() > 0) {
    console.log(obj.text);

This Meteor code returns true correctly when data field exists, but the var obj is a cursor to the parent document and not to the data embedded document. How can I fix this? Thanks

enter image description here

Upvotes: 0

Views: 46

Answers (1)

Kishor
Kishor

Reputation: 2677

I don't think you can return embedded document as result with a simple find. Based on your previous question and this question, I suggest you use something like this (I myself never iterated on cursors in a blaze),

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, isActiveTaskCol: true };
        } else {
            return {items: data, ready: ready};
        }
    }
});

In your template html,

<template name="index">
    {{#if taskInputs.isActiveTaskCol}}
        {{> listItem taskInputs.items.data}}
    {{else}}
        {{> listItem taskInputs.items}}
    {{/if}}
</template>

<template name="listItem">
    {{#each this}}
        <div>Do whatever you want here like {{this.taskName}}</div>
    {{/each}}
</template>

OR

you can just use fetch in your helpers directly to get array and use underscore to get the desired result.

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

        var selectedTask = Session.get('taskSelected');
        var items = ActiveTaskCol.find({
            action: selectedTask,
            data: { $exists: true }
        }, {
            field: {data: 1}
        }).fetch();
        if (items.length > 0) {  
            items = _.pluck(item, 'data'); //this transforms [ { data: "item1" }, { data: "item2" } ] to [ "item1", "item2" ]
            return {items: items };
        } else {
            return {items: data, ready: ready};
        }
    }
});

In your template html,

<template name="index">        
    {{#each taskInputs.items}}
        <div>Do whatever you want here like {{this.taskName}}</div>
    {{/each}}
</template>

Hope it helps

Upvotes: 1

Related Questions