6

假设我想维护每个用户的项目列表(在 Node.js 环境中使用 Mongoose ODM 的 MongoDB 中),然后查询项目是否归用户所有。例如,我想存储每个用户喜欢的所有颜色,然后查看特定颜色是否属于特定用户。在我看来,最好将颜色存储为用户文档中的嵌入对象,而不是用户文档中的数组。原因是检查对象中是否存在颜色似乎更有效,因为我可以检查对象属性是否存在:

if(user.colors.yellow){
  //true case
} else {
  //false case
}

与我必须遍历整个数组以查看颜色是否存在于数组中某处的数组相比:

for (var i = 0; i < user.colors.length; i++) {
  if(user.colors[i] === "yellow"){
    //true case
  } else {
    //false case
  }
}

但是,从我在网上看到的许多示例中,似乎使用数组来处理这种类型的事情相当普遍。我错过了什么吗?有什么优点/缺点,最好的方法是这样做的?

4

2 回答 2

2

如果颜色存储为数组,则不必使用 for 循环。您可以只使用indexOf,如:

if(user.colors.indexOf("yellow") != -1){
   //true case
}

也就是说,无论您使用嵌入式文档还是数组,这两种方式都无关紧要。这并不像其中一个会带来巨大的性能优势。

于 2012-09-09T03:07:24.277 回答
1

您经常会在 MongoDB 集合中看到用于存储此类信息的嵌入式数组,因为如果您向数组属性添加索引,它们的查询效率很高,并且它们使用自然语法。在这种情况下,类似于以下内容(假设用户集合包含颜色数组属性):

db.users.find({id: 1, colors: 'yellow'})

如果您使用单个颜色属性执行此操作,您将有一个看起来更尴尬的查询,并且您必须单独索引每种颜色(而不是colors像上面那样):

db.users.find({id: 1, 'colors.yellow': true})
于 2012-09-09T03:51:50.497 回答