Reputation: 6029
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
Upvotes: 0
Views: 46
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