在perl中返回重复记录的游标对象
这个解释给了我很大的帮助在perl中返回重复记录的游标对象,perl,mongodb,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
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;
$num返回相同的值
我正试图访问这样的记录
$VAR1 = {
'nscannedObjectsAllPlans' => 45824,
'n' => 33459,
它给了我重复的记录,而循环运行的记录数超过了解释中返回的记录数
我这样做有什么不对吗?你知道为什么会有重复记录吗
谢谢
拉吉
样本记录:
while (my $record = $rsvnDB->next) {
在没有听到我的任何回应后,我想
parent\u id
字段以及可能更多的字段都包含一个对象。默认情况下,使用Perl MongoDB驱动程序并从数据库中获取文档。这就是为什么您会看到越来越多的文档被提取,而您的数据中可能包含循环引用,这可能对您没有帮助
更改对MongoClient的调用,通过禁用该行为来修复此问题
> 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" : [ ]
}
>
给自己一个提示,让JIRA在默认情况下关闭此功能,并将其保留在此处,以防一些遇到此问题,这样可以对他们有所帮助
现在我们有了一些样本数据,我们可以从不同的角度来看待这个问题
如果您在收藏中包含了一个示例文档,那么在这里查看的各种人都会非常清楚这一点。问问题时要记住一点
您提到的行为可能是由上面提到的某种形式的递归引起的。由于这是而不是出故障的驱动程序,我们正在查看您的代码以了解问题所在
所发布的代码没有任何问题,但它明显没有达到迭代光标时在循环中所做的工作
考虑到您最初的查询是在寻找一个具有父id
的文档,一个合理的推论是您打算对循环中的父id
执行一些操作。另外,您的示例数据还特别显示了\u id
和父id
实际上是相同的
因此,如果您有任何代码遵循此
parent\u id
,那么这无疑是您看到结果的原因。您的文档是什么样子的。您可以通过显示集合中的一些示例文档进行编辑。还可以尝试从mongo shell进行比较。但是你所做的很简单。我已经用样本记录更新了这个问题。让您知道没有DBRef对象。我试过你的建议,但对我没有帮助。记录中没有循环引用。唯一的解释是数据以某种方式被递归。你在循环光标的时候到底在做什么?@Raj你真的需要看看这些编辑现在看来很清楚到底发生了什么……这触发了我的解决方案。Neil我想你是在写,我更改了文档并写回DB,cursor再次将其拾取并显示给我,好像有一条记录。谢谢,我在while循环中更改了代码。我想我应该删除这篇文章,这是一个简单的perl编码问题。你觉得尼尔怎么样?
my $dbClient = MongoDB::MongoClient->new( inflate_dbref => 0 );