Mongodb 计算结果文档中匹配值的数目

Mongodb 计算结果文档中匹配值的数目,mongodb,Mongodb,我在一个项目中工作,我想找到类似类型的值,所以我查询我的数据库,我想计算匹配的值,以便我可以使用具有最大计数的文档 我已经编写了几乎所有的查询,但无法计算$in数组中的匹配值 在下面的代码中,我想计算每个文档的匹配数组值 db.getCollection('combine_problems') .find({ 'answer':'United States', 'book_id':{ $nin:['103','102','101',

我在一个项目中工作,我想找到类似类型的值,所以我查询我的数据库,我想计算匹配的值,以便我可以使用具有最大计数的文档

我已经编写了几乎所有的查询,但无法计算
$in
数组中的匹配值

在下面的代码中,我想计算每个文档的匹配数组值

db.getCollection('combine_problems')
    .find({
        'answer':'United States',
        'book_id':{
            $nin:['103','102','101','105']
        },
        'choices': { 
            $in:  ['species', 'new habitat', 'range of species','United States' ] 
        }
    })

我想要匹配的文档和每个文档对应的计数值

如果您只想获得每个
选项
中的文档计数,您只需在
选项
上进行分组并获得计数,但是如果要在上述查询中附加
选项计数
,您可能需要使用脚本获取预期的输出。请看下面的流程:

将上述查询结果存储在一个变量中,比如说
docs
,并在查询结束时添加一个
.toArray()
(也就是说,仅当您有少量文档时,不要使用
toArray()
,只需在光标上执行forEach操作,并在下面的forEach操作中创建一个新对象),这将为您提供一个包含键
选项的对象数组

然后运行另一个查询,其中 可以在
选项上使用和执行以下操作:

db.getCollection('combine_problems').aggregate([
{
    $match: {
        $and: [
            { 'answer': 'United States' },
            {'book_id': {$nin: ['103', '102', '101', '105']}},
            {'choices': {$in: ['species', 'new habitat', 'range of species', 'United States']}
        ]
    }
},
{
    $group: { _id: "$choices", choice_count: { $sum: 1 } }

}])
它将给出所有选项的计数,并将
.toArray()
附加到它,并将结果存储在一个变量中,比如说
计数
,在该变量中,您将获得另一个包含两个键的对象数组,如
选项
选项_计数

稍后在第一个变量
docs
上运行
foreach
,并将
counts
对象中所有匹配的
选项添加为:

docs.forEach(function(obj){
    var choice = obj['choices'];
    var choice_value = 0;
    counts.forEach(function(choice){
       if(choice['_id'] == choice)
       {
          choice_value = choice['choice_count'];
          break;
       }
    })
    obj['choice_count']=choice_value;
})
//to check if you have the count in the same document use print. 
print(JSON.stringify(docs));

如果您只想获得每个
选项中的文档计数
,您只需在
选项
上进行分组即可获得计数,但如果您想在上述查询中附加
选项计数
,则可能需要使用脚本来获得预期的输出。请看下面的流程:

将上述查询结果存储在一个变量中,比如说
docs
,并在查询结束时添加一个
.toArray()
(也就是说,仅当您有少量文档时,不要使用
toArray()
,只需在光标上执行forEach操作,并在下面的forEach操作中创建一个新对象),这将为您提供一个包含键
选项的对象数组

然后运行另一个查询,其中 可以在
选项上使用和执行以下操作:

db.getCollection('combine_problems').aggregate([
{
    $match: {
        $and: [
            { 'answer': 'United States' },
            {'book_id': {$nin: ['103', '102', '101', '105']}},
            {'choices': {$in: ['species', 'new habitat', 'range of species', 'United States']}
        ]
    }
},
{
    $group: { _id: "$choices", choice_count: { $sum: 1 } }

}])
它将给出所有选项的计数,并将
.toArray()
附加到它,并将结果存储在一个变量中,比如说
计数
,在该变量中,您将获得另一个包含两个键的对象数组,如
选项
选项_计数

稍后在第一个变量
docs
上运行
foreach
,并将
counts
对象中所有匹配的
选项添加为:

docs.forEach(function(obj){
    var choice = obj['choices'];
    var choice_value = 0;
    counts.forEach(function(choice){
       if(choice['_id'] == choice)
       {
          choice_value = choice['choice_count'];
          break;
       }
    })
    obj['choice_count']=choice_value;
})
//to check if you have the count in the same document use print. 
print(JSON.stringify(docs));

请参考MongoDB的官方文档请参考MongoDB的官方文档查询并没有给出某些应用程序中类似选择的准确计数document@Anujtyagi通过
query'检查
分组的结果,它应该给你所有选择的结果和它们的计数。查询没有给出在某些情况下类似选择的准确计数document@Anujtyagi检查
groupby
query'的结果,它会给出所有选择的结果及其计数。