【问题标题】:MongoDB - Collection query based on an array of objectsMongoDB - 基于对象数组的集合查询
【发布时间】:2014-03-03 22:17:57
【问题描述】:

我有一个包含艺术家、歌曲名称和其他一些数据的对象数组,例如:

var obj = {  
  artist: 'Of Monsters and Men',  
  title: 'Little Talks',
  data: 'important thing'  
}

var array = [<obj1>, <obj2>, <obj3>];

我还有一个包含歌曲的 mongoDB 集合。我需要查询这个集合并返回所有在前一个数组中包含艺术家和标题的歌曲。我还需要访问匹配对象的数据字段。
我曾经在数组中循环并对每个对象执行查询,但它消耗了太多资源,因为数组中可能有成百上千个对象。有没有办法实现?

【问题讨论】:

  • 你不妨现在就接受一个答案......努力回答你问题的人值得这样:)
  • 在测试之前我需要解决另一个问题 ;)

标签: node.js mongodb


【解决方案1】:

正如@vmr 建议的那样,您可以更改架构,但如果您不想这样做,这里有几个选项:

您可以使用聚合框架。

`db.collection.aggregate( { $group: {
    _id:{artist:"$artist", title:"$title"},
    data:{$push:"$data"}
}, function(err, result){})`

** 记住 ** 生成的文档必须小于 16MB。

或者,您可以像这样打开光标

db.collections.find({ artist: 'some artist', title: 'some title'}, function(err, cursor){ //don't call .toArray() 
    function handleItem(err, item){ 
        if(item == null) return;
        //do stuff...
        cursor.nextObject(handleItem);
    }
    cursor.nextObject(handleItem);
})

这肯定会减少您的迭代器,并且由于每个文档已经小于 16 MB,您不必担心聚合文档太大

【讨论】:

    【解决方案2】:

    解决此问题的理想方法是重新设计架构: 文档架构应如下所示:

    { 艺术家:“怪物与人”,
    标题:“小谈话”,
    数据:'重要的事情'
    歌曲:[{song1 details},{song2 详细信息},....] }

    这种方式检索会快得多,因为您需要访问艺术家的单个文档。

    【讨论】:

    • 您的意思是按艺术家重新组合歌曲吗?如果是这样,我猜应该将标题/数据属性移至歌曲详细信息。
    • 是的,您也可以这样做,您的当前架构会导致数据冗余。除非您链接文档,否则这可能会导致更新异常。
    猜你喜欢
    • 1970-01-01
    • 2018-03-22
    • 2020-07-27
    • 2022-12-18
    • 2016-10-25
    • 2018-04-13
    相关资源
    最近更新 更多