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) {
它给了我重复的记录,而循环运行的记录数量超过说明。
我的方式有什么错吗?知道为什么它给出重复的记录?
谢谢raj
样本记录:
> 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" : [ ]
}
>
在我想到 parent_id
字段并可能包含一个dbref对象时,没有听到我的任何响应后。默认情况下,Perl MongoDB驱动程序扩展了这些引用,并从数据库中获取文档。这就是为什么您正在看到更多文档正在拔出的原因,并且可能没有帮助您的数据中有循环参考。
通过禁用行为来更改对Mongoclient的呼叫以解决此问题。
my $dbClient = MongoDB::MongoClient->new( inflate_dbref => 0 );
给自己一张笔记以提高jira默认情况下关闭它,并在此处将其关闭,以防某些 dos 遇到问题,因此对他们有帮助。p>所以现在我们有了一些示例数据,我们可以对此进行不同的看法。
如果您在收藏中包含示例文档,那么在这里查看的各个人来说,这将是非常清楚的。问您的问题时要牢记的好点。
您提到的行为可能是由某种形式的递归引起的,如上所述。由于这是不是有错的驱动程序,因此我们正在寻找您的代码来查看问题。
已发布的代码没有错,但是在迭代光标
时,它显着落在循环中所做的事情考虑到您的初始查询正在寻找具有parent_id
的文档的合理扣除额,是您打算在循环中使用该parent_id
做点事。另外,您的示例数据特别表明_id
和parent_id
实际上都是相同的。
因此,如果您有任何代码遵循此parent_id
,那么毫无疑问,您为什么看到自己是结果。