我在 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/