从集合中返回嵌入式文档

时间:2016-03-16 00:17:04

标签: meteor

此Meteor代码尝试将游标返回到字段data引用的嵌入文档,然后在返回此模板帮助程序之前检查它是否存在(因为有些时候它不存在于ActiveTaskCol中)方法。

稍后添加
预期返回的游标将在html {{#each data}}中用于更多工作,因此使用.find代替.findOne

问题是即使data中没有ActiveTaskCol字段,if语句的计算结果为true,我也尝试了obj.count() > 0,即使"数据& #34;字段不存在于集合中。
我怎样才能解决这个问题?谢谢

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};
        }
    }
});

1 个答案:

答案 0 :(得分:1)

总是如此,因为您正在使用find,它返回一个游标。相反,您应该使用findOne,这样,如果没有这样的文档,它将返回文档或未定义。我还建议您使用obj来检查虚假值,例如undefinednullfalse而不是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};
        }
    }
});

<强>更新 根据您的评论,您可以使用obj.count()检查是否有符合条件的文档。

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};
        }
    }
});

更新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};
        }
    }
});