Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript MongoDB阵列与对象_Javascript_Mongodb - Fatal编程技术网

Javascript MongoDB阵列与对象

Javascript MongoDB阵列与对象,javascript,mongodb,Javascript,Mongodb,假设我想维护每个用户的项目列表(在Node.js环境中的MongoDB和Mongoose ODM中),然后查询一个项目是否为用户所有。例如,我想存储每个用户最喜欢的所有颜色,然后查看特定的颜色是否属于特定的用户。在我看来,最好将颜色作为嵌入对象存储在用户文档中,而不是存储在用户文档中的数组中。原因是,检查对象中是否存在颜色似乎更有效,因为我可以检查对象属性是否存在: if(user.colors.yellow){ //true case } else { //false case }

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

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
  }
}
for(var i=0;i

然而,从我在网上看到的许多例子来看,似乎对这种类型的东西使用数组是相当普遍的。我错过什么了吗?优缺点是什么,最好的方法是什么?

如果颜色存储为数组,则不必使用for循环。您只需使用
indexOf
,如下所示:

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

也就是说,无论是使用嵌入式文档还是数组,这两种方式都不重要;这两种方法都不会带来巨大的性能优势。

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

如果对单个颜色属性执行此操作,则会出现类似这样的查询,并且必须对每个颜色分别进行索引(而不是像上面那样仅对
颜色
):


您能提供这些建议的链接吗?
这两个建议并不会带来巨大的性能优势。这是真的吗?!如果是,规模如何。如果只有8种颜色,它将可以忽略不计,一次。但是,对于许多颜色,或者在一个循环中多次访问,又如何呢?
db.users.find({id: 1, colors: 'yellow'})
db.users.find({id: 1, 'colors.yellow': true})