如何在MongoDB中按对象数组进行搜索,评分和排序?

时间:2017-08-29 11:45:38

标签: c# mongodb mongodb-query

假设有以下类型的MongoDB文档;

'标签'

[
{
_id:1,
name:[ 'C#', 'C#.NET', 'csharp' ]
},
_id:2,
name:[ '.NET', '.NET Framework', 'dotnet framework' ]
},
_id:3,
name:[ 'javascript', 'js' ]
}
]

'信息'

[
{
  _id: 1,
  contributer: { first: 'XXX', last: '-' },
  tags: [ { name: 'C#', tag_id: '1' }, { name: '.NET Framework', tag_id: '2' }  ]
},
{
  _id: 2,
  contributer: { first: 'YYY', last: '-' },
  tags: [ { name: 'javascript', tag_id: '3' } ]
},
{
  _id: 3,
  contributer: { first: 'XXX', last: '-' },
  tags: [ { name: '.NET Framework', tag_id: '2' } ]
}]

我想通过多个标签进行搜索,例如;

{ 
  _ids: [1 ,2 ] 
}

在帖子文件中,文件超过100万(并且仍在增长),并且与不相关的订单结果相关。

我正在寻找通过用现有的解决方案(如map-reduce)和最佳搜索查询更好地替换文档结构来获得紧固结果的先进解决方案。

预期结果将是;

'结果'

[
{
  _id: 1,
  contributer: { first: 'XXX', last: '-' },
  tags: [  { name: 'C#', tag_id: '1' }, { name: '.NET Framework', tag_id: '2' } ]
},
{
  _id: 3,
  contributer: { first: 'XXX', last: '-' },
  tags: [ { name: '.NET Framework', tag_id: '2' } ]
}]

到目前为止,我已尝试使用代码片段(多个$ elemmatch);

db.posts.find(
   {
      tags: {
                $elemMatch: {
                     tag_id: "1", "2",
                },
                $elemMatch: {
                     tag_id: "1",
                },
      }
   }
)

但不确定它是否是唯一且最佳的解决方案。您可以包含MongoDB或C#驱动程序代码。谢谢你的建议!

1 个答案:

答案 0 :(得分:1)

这里的关键是索引,我建议你花一些时间根据你搜索的内容定义索引。我建议使用explain()方法来查看查询执行计划,看看你可以改进什么。如果您的查询在收集扫描时达到100%,那将会非常缓慢。

不确定你是否已经完成,但不能高度推荐MongoDB大学的.NET开发者免费课程(https://university.mongodb.com/courses/M101N/about)。