use MongoDB;
my $dbClient = MongoDB::MongoClient->new();
my $db = $dbClient->get_database( 'exp_new' );
my $rsvnCollection = $db->get_collection( 'reservations' );
my $rsvnDB = $rsvnCollection->find({parent_id => {'$exists' => 1}});
my $explanation = $rsvnDB->explain;
my $num = $rsvnDB->count;
解释是给我的
$VAR1 = {
'nscannedObjectsAllPlans' => 45824,
'n' => 33459,
和$ num返回相同的内容。
我正试图访问这样的记录
while (my $record = $rsvnDB->next) {
它给了我重复的记录,而循环运行的记录数量多于解释中返回的记录数。
我的方式有什么不对吗?知道为什么要提供重复记录吗?
由于 拉吉
样本记录:
> db.reservations.findOne({parent_id: {$exists : 1}})
{
"_id" : 428,
"created_user" : "george",
"status" : NumberLong(2),
"topologies" : [ ],
"parent_id" : 428,
"end_time" : ISODate("2012-08-25T01:45:00Z"),
"reserved_ports" : {
"bangalore" : [
"eth 12/1",
"eth 12/10",
]
},
"repeatInfo" : {
"recurrEndType" : "Occurrences",
"recurrType" : "Daily",
"recurrValue" : NumberLong(9)
},
"created_time" : ISODate("2012-08-24T00:16:34Z"),
"name" : "George",
"start_time" : ISODate("2012-08-24T16:20:01Z"),
"deleted" : "0",
"task" : "ACTIVATION",
"modified" : "0",
"devices" : [
"bangalore"
],
"updated_time" : ISODate("2012-08-30T01:44:55Z"),
"ports" : [ ],
"updated_user" : "George",
"reserved_devices" : [
"bangalore"
],
"topology_details" : [ ]
}
>
答案 0 :(得分:0)
在我听到parent_id
字段并且可能包含DBRef对象时,我没有听到任何回复。默认情况下,Perl MongoDB驱动程序expands those references并从数据库中提取文档。这就是为什么你看到更多的文件被拉出来,它可能没有帮助你的数据可能有一个循环引用。
将您的调用更改为MongoClient,以通过禁用该行为来解决此问题。
my $dbClient = MongoDB::MongoClient->new( inflate_dbref => 0 );
给自己一个注释,提出一个JIRA默认关闭它,并留下这个以防一些确实遇到问题,所以它对他们有帮助。
所以现在我们有一些样本数据,我们可以用不同的方式来看待它。
如果你在你的收藏中包含一个样本文件,那么在这里看到的人会非常清楚。在提出问题时要记住这一点。
您提到的行为很可能是由上面提到的某种形式的递归引起的。由于这是不错误的驱动程序,我们有点期待您的代码来查看问题。
已经发布的代码没有任何问题,但是当你在迭代光标时,它显然没有你在循环中做的事情
合理的推论,考虑到您的初始查询正在查找具有parent_id
的文档,您打算在循环中对parent_id
执行某些操作。此外,您的示例数据显示_id
和parent_id
实际上都是相同的。
因此,如果你有 这个parent_id
代码,那么毫无疑问,为什么你会看到你的结果。