当我使用find()时,为什么项目显然在我的mongoDB数据库中重复?

时间:2013-12-18 17:10:18

标签: sql mongodb database

我正在浏览他们网站上的try.mongodb.org教程(网页上的嵌入式终端模拟器)。我在项目t4和t5(你在教程中为项目键入tx)。

在t4中我们填充数据库。

>     t4. Saving and Querying
>     Try adding some documents to the scores collection:
>       for(i=0; i<10; i++) { db.scores.save({a: i, exam: 5}) }; 
>     
>     Try that, then enter
>       db.scores.find(); 
>     to see if the save succeeded. Since the shell only displays 10 results at time,
>     you'll need to enter the 'it' command to iterate over the rest.
>     
>     (enter 'next' when you're ready)

我考试5 +我只是为了好玩:

for(i=0; i<10; i++) { db.scores.save({a: i, exam: 5+i}) }; 

那么数据库中有什么?我输入db.scores.find();并得到以下,这是我所期望的,虽然顺序似乎是随机的。细

>

[ 
  {   "exam" : 14,   "a" : 9,   "_id" : {   "$oid" : "52b1d16bcc937439340649c4"   }   },
  {   "exam" : 5,   "a" : 0,   "_id" : {   "$oid" : "52b1d191cc937439340649c5"   }   },
  {   "exam" : 6,   "a" : 1,   "_id" : {   "$oid" : "52b1d191cc937439340649c6"   }   },
  {   "exam" : 7,   "a" : 2,   "_id" : {   "$oid" : "52b1d191cc937439340649c7"   }   },
  {   "exam" : 8,   "a" : 3,   "_id" : {   "$oid" : "52b1d191cc937439340649c8"   }   },
  {   "exam" : 10,   "a" : 5,   "_id" : {   "$oid" : "52b1d191cc937439340649c9"   }   },
  {   "exam" : 9,   "a" : 4,   "_id" : {   "$oid" : "52b1d191cc937439340649ca"   }   },
  {   "exam" : 11,   "a" : 6,   "_id" : {   "$oid" : "52b1d191cc937439340649cb"   }   },
  {   "exam" : 12,   "a" : 7,   "_id" : {   "$oid" : "52b1d191cc937439340649cc"   }   },
  {   "exam" : 13,   "a" : 8,   "_id" : {   "$oid" : "52b1d191cc937439340649cd"   }   }
]

在t5中,我们搜索该数据库中的项目:

>
5. Basic Queries You've already tried a few queries, but let's make them more specific. How about finding all documents where a == 2:
     

db.scores.find({a:2});

Or what about documents where a > 15?   db.scores.find({a: {'$gt': 15}});

a == 2搜索有效,但&gt; 15一个没有。首先,根据项目t4,不应有超过15的条目 所以我尝试超过6:db.scores.find({a: {'$gt': 6}});

我得到以下输出,这对我来说真的很令人惊讶,因为对于== 7,a == 8和a == 9,应该只有3个条目。

>

[ 
  {   "exam" : 14,   "a" : 9,   "_id" : {   "$oid" : "52b1d16bcc937439340649c4"   }   },
  {   "exam" : 12,   "a" : 7,   "_id" : {   "$oid" : "52b1d191cc937439340649cc"   }   },
  {   "exam" : 13,   "a" : 8,   "_id" : {   "$oid" : "52b1d191cc937439340649cd"   }   },
  {   "exam" : 14,   "a" : 9,   "_id" : {   "$oid" : "52b1d191cc937439340649ce"   }   },
  {   "exam" : 12,   "a" : 7,   "_id" : {   "$oid" : "52b1d1a8cc937439340649d6"   }   },
  {   "exam" : 13,   "a" : 8,   "_id" : {   "$oid" : "52b1d1a8cc937439340649d7"   }   },
  {   "exam" : 14,   "a" : 9,   "_id" : {   "$oid" : "52b1d1a8cc937439340649d8"   }   },
  {   "exam" : 5,   "a" : 7,   "_id" : {   "$oid" : "52b1d49fcc937439340649f1"   }   },
  {   "exam" : 5,   "a" : 9,   "_id" : {   "$oid" : "52b1d49fcc937439340649f3"   }   },
  {   "exam" : 5,   "a" : 8,   "_id" : {   "$oid" : "52b1d49fcc937439340649f4"   }   }
] 

如果你看一下右边最初输出的db.scores.find()id,最后一个字符随每个条目上升 - 4,5,6,7,8,9,a,b,c, d。但是在重复的条目中,看看a == 9的条目。我们在4中有一个结尾,一个以e结尾,一个以3结尾。似乎在操作的大脑中数据库有30个条目,而不是10。

{“考试”:14,“a”:9,“_ id”:{“$ oid”:“52b1d16bcc937439340649c4”}}, {“考试”:14,“a”:9,“_ id”:{“$ oid”:“52b1d191cc937439340649ce”}}, {“考试”:5,“a”:9,“_ id”:{“$ oid”:“52b1d49fcc937439340649f3”}},

我注意到如果我尝试使用t4中的循环重新填充数据库,它似乎不会重写值。即如果我使用for(i=0; i<10; i++) { db.scores.save({a: i, exam: 5}) };作为示例建议而不是我只是为了好玩for(i=0; i<10; i++) { db.scores.save({a: i, exam: 5+i}) };。不确定这是否有助于诊断问题,但这是另一种观察。

2 个答案:

答案 0 :(得分:1)

您确定没有多次运行这些命令吗?如果你运行db.scores.find()。count(),你会看到什么,它将告诉你表中有多少项。

答案 1 :(得分:1)

你遗漏了一些非常特别的东西,

  

我注意到,如果我尝试使用循环重新填充数据库   在t4中它似乎没有重写值。即如果我使用(i = 0;   I&LT; 10; i ++){db.scores.save({a:i,exam:5})};作为例子   建议而不是我的乐趣(i = 0; i&lt; 10; i ++){   db.scores.save({a:i,exam:5 + i})};。不确定这是否有帮助   诊断问题,但这是另一个观察。

重新填充运行查询的数据库不止一次将每次创建10行。 db.scores.save不知道要更新的文档,因为您没有引用_id字段,在这种情况下,它将始终创建10条记录。要更新现有记录,您应该提供先前插入的_id字段。我确定你不止一次运行它,你希望总有10条记录,你每次都要插入10条记录。

尝试删除集合,运行循环一次并执行查找,它将起作用。