【问题标题】:returning embedded document from collection find从集合查找返回嵌入文档
【发布时间】:2016-03-16 10:37:02
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: meteor


    【解决方案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};
            }
        }
    });
    

    更新: 根据您的 cmets,您可以使用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};
            }
        }
    });
    

    【讨论】:

    • 既然我需要返回 {items: obj} 如果数据字段存在,你的意思是 if(obj) 因为那将确保它不是 (undefined, null, false)?而不是你输入的 if (!obj)?谢谢
    • 我使用 find 而不是 findOne 的原因是我需要模板帮助器返回一个光标,以便 html 模板 {{#each data}} 可以使用它。另外,我需要为字段“数据”而不是顶级文档引用的嵌入文档获取光标。 p.s.感谢 !obj 的快速修复 :)
    • “数据”字段不存在,但 obj.count() 返回大于 0,因此计算结果为真。这是为什么?如果字段“数据”不存在,我如何才能“找到”仅嵌入文档“数据”而不存在?
    • 如果要在数据列存在的情况下返回文档,则需要在查询选择器中使用$exists
    • @FredJ。更新了答案。
    猜你喜欢
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 2014-11-03
    • 2016-02-11
    • 1970-01-01
    相关资源
    最近更新 更多