MongoDB :: Cursor对象返回perl中的重复记录

时间:2014-02-07 02:17:19

标签: perl mongodb

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" : [ ]
}
> 

1 个答案:

答案 0 :(得分:0)

在我听到parent_id字段并且可能包含DBRef对象时,我没有听到任何回复。默认情况下,Perl MongoDB驱动程序expands those references并从数据库中提取文档。这就是为什么你看到更多的文件被拉出来,它可能没有帮助你的数据可能有一个循环引用。

将您的调用更改为MongoClient,以通过禁用该行为来解决此问题。

my $dbClient = MongoDB::MongoClient->new( inflate_dbref => 0 );

给自己一个注释,提出一个JIRA默认关闭它,并留下这个以防一些确实遇到问题,所以它对他们有帮助。

所以现在我们有一些样本数据,我们可以用不同的方式来看待它。

如果你在你的收藏中包含一个样本文件,那么在这里看到的人会非常清楚。在提出问题时要记住这一点。

您提到的行为很可能是由上面提到的某种形式的递归引起的。由于这是错误的驱动程序,我们有点期待您的代码来查看问题。

已经发布的代码没有任何问题,但是当你在迭代光标时,它显然没有你在循环中做的事情

合理的推论,考虑到您的初始查询正在查找具有parent_id的文档,您打算在循环中对parent_id执行某些操作。此外,您的示例数据显示_idparent_id实际上都是相同的。

因此,如果你有 这个parent_id代码,那么毫无疑问,为什么你会看到你的结果。