javascript - MongoDB 数组从 10 中匹配 6

标签 javascript mongodb meteor

我在 mongodb 中有一个集合,其中包含数千个这样的文档:

{
    "numbers" : [
            31,
            12,
            19,
            41,
            2,
            15
    ],
    "date" : ISODate("2014-06-18T09:37:59.164Z"),
    "string" : "31,12,19,41,2,15",
    "_id" : "Eg38tNEZFtTZTmxjx"
}

我还有一个匹配数组,例如 [1,2,3,4,5,6,7,8,10]

如何查询匹配数组中6个数字的文档;

我知道这个:db.collection.find({numbers:{$all:[1,2,3,4,5,6]}});

但这限制了我检查仅包含 6 个数字的匹配数组,我希望匹配数组包含 10 个数字,并且仅返回包含这 10 个数字中的 6 个数字的文档。

附:如果需要向其中添加任何字段,我可以更改文档的形式。为了让比赛进行得更快。我可以重写整个数据库,这不是问题。

最佳答案

我想说你最好的起点是研究 mongodb $where 运算符:

http://docs.mongodb.org/manual/reference/operator/query/where/

这使您有机会编写自定义函数进行比较。但是,如果性能是一个问题,您可能必须重新审视模型设计以实现更好的索引。

减少数组以匹配的示例代码:

var numbers = [31,12,19,41,2,15,1,4,3,7,5];
var matchArray = [1,2,3,4,5,6,7,8,9,10];
function isInList() {
    var reducedNums = numbers.filter(function(num) {
        return matchArray.indexOf(num) !== -1
    });

    console.log(reducedNums);
}

使用 reducedNums,您将能够检查长度以确保它 >= 6。

要在查询中使用它,您可以执行以下操作:

var matchArray = [1,2,3,4,5,6,7,8,9,10];

function isInList() {
    // `this` contains each object in the mongo query.
    var reducedNums = this.numbers.filter(function(num) {
        return matchArray.indexOf(num) !== -1
    });
    return reducedNums.length >= 6;
}

db.myDocuments.find({ $where: isInList });

该代码未经测试,仅供引用。

关于javascript - MongoDB 数组从 10 中匹配 6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24329493/

相关文章:

javascript - 带有导航(下一个,上一个)按钮的 CSS 滚动捕捉点

java - 具有超过10个参数的Spring Data Mongo

javascript - Reactive Meteor Templates and Deps Dependency——当另一个模板改变或重新渲染时更新模板

javascript - 多个连续 AJAX 请求 RXJS

javascript - 通过 HTML5 API(RecordJS 或替代方案)将音频录制为 AAC

node.js - MongoClient native FindAndModify "Need update or remove"错误

mongodb - 使用 Helm 在 Kubernetes 中安装 Mongodb

javascript - 从空格键中的模板事件监听器访问 _id #each 循环

meteor - 如何使拖放 Formbuilder 适应 Meteor

Javascript 自动执行 onclick