$ mongo运营商在meteorjs中工作

em.*_*epi 1 mongodb meteor

我有一个MongoDB查询在MongoDB shell中完美运行

 db.collection.find({ $where: 
function(){
    var num = this.numbers;
    function isInList(numbers,matchArray) 
        {
            var reducedNums = numbers.filter(function(num) {
            return matchArray.indexOf(num) !== -1
            });
            if (reducedNums.length == 7){
                return true;
            } else {
                return false;
            }
        }
    return isInList(num, [ 28 ,5, 17, 47, 1, 24, 37, 19, 4, 3 ] );
    }
}
);
Run Code Online (Sandbox Code Playgroud)

我如何在MeteorJS中实现这个是什么工作?

根据请求进行说明:我需要在服务器端提供一个功能,如果它在客户端工作则无关紧要.该函数必须将给定数组与文档上的数字字段匹配,并告诉我数组中有多少数字匹配,文档ID或类似的东西:

if (match.length == 7){
                return "DOCUMENT";
            } else {
                return false;
            }
Run Code Online (Sandbox Code Playgroud)

试过这个:添加了代码(meteor是服务器):

console.log(Tickets.find({ $where: 
function(){
        var num = this.numbers;
        function isInList(numbers,matchArray) 
            {
                var reducedNums = numbers.filter(function(num) {
                return matchArray.indexOf(num) !== -1
                });
                if (reducedNums.length == 7){
                    return true;
                } else {
                    return false;
                }
            }
        return isInList(num, [ 28 ,5, 17, 47, 1, 24, 37, 19, 4, 3 ] );
        }
    }
))
Run Code Online (Sandbox Code Playgroud)

输出是这样的:

 I20140623-17:15:02.690(2)? { _mongo:
 I20140623-17:15:02.910(2)?    { _connectCallbacks: [ [Function] ],
 I20140623-17:15:02.911(2)?      _observeMultiplexers: {},
 I20140623-17:15:02.912(2)?      _onFailoverHook: { nextCallbackId: 0, callbacks: {} },
 I20140623-17:15:02.913(2)?      _docFetcher: { _mongoConnection: [Circular], _callbacksForCacheKey: {} },
 I20140623-17:15:02.914(2)?      _oplogHandle:
 ...
 ...
 ...
 I20140623-17:15:03.025(2)?      selector: { '$where': [Function] },
 I20140623-17:15:03.027(2)?      options: { transform: null } },
 I20140623-17:15:03.030(2)?   _synchronousCursor: null }
 => Meteor server restarted
Run Code Online (Sandbox Code Playgroud)

当我执行.fetch()时,所有文档都会打印出来,这不应该发生,这段代码在mondodb shell中完美运行.

解答感谢@AndrewMao:第一个解决方案:通过在函数末尾添加.toString(),我测试的.toString()在NodeJS中完美运行

例如:

Tickets.find({'$where':     function(){
    var num = this.numbers;
    function isInList(numbers,matchArray) 
        {
            var reducedNums = numbers.filter(function(num) {
            return matchArray.indexOf(num) !== -1
            });
            if (reducedNums.length == 7){
                return true;
            } else {
                return false;
            }
        }
    return isInList(num, [ 28 ,5, 17, 47, 1, 24, 37, 19, 4, 3 ] );
    }.toString();
}).fetch();
Run Code Online (Sandbox Code Playgroud)

第二个解决方案:如果您想在查询中添加自定义数组或其他内容:

你必须将你的函数作为一个字符串传递到一行,你也可以在其中添加其他字符串,就像我对随机数组一样.在下面的例子中查看函数调用(isInList(num,['+ random +']);}').

例如:

 var random = [ 19 ,3, 14, 24, 2, 38, 48, 19, 4, 3 ];

 Tickets.find({'$where': 'function(){var num = this.numbers; function isInList(numbers,matchArray) {var reducedNums = numbers.filter(function(num) { return matchArray.indexOf(num) !== -1  }); if (reducedNums.length == 7){ return true;} else {  return false;   }}return isInList(num,['+ random +']);}'}).fetch();
Run Code Online (Sandbox Code Playgroud)

And*_*Mao 7

您的问题可能与$where查询无关; 这是因为您打印的是光标而不是匹配的文档.即,附加.fetch().find():http://docs.meteor.com/#fetch的末尾

游标是对文档的选定组的参考,并不实际抢单据直到你尝试.map(),.fetch().forEach()在其上.

此外,你需要传递$where函数作为一个字符串,而不是一个实际的功能:https://groups.google.com/forum/#!topic/meteor-talk/ErgCC4g_bB0.这是Mongo处理和运行函数所必需的(它不是在Node中完成的.)

Tickets.find({ $where: 'function() { ... }' });
Run Code Online (Sandbox Code Playgroud)

您将无法获得源代码突出显示的好处,但您测试的功能应该有效.你也可以试试

Tickets.find({ $where: function() { ... }.toString() });
Run Code Online (Sandbox Code Playgroud)

但这可能只适用于浏览器而不适用于Node.