Scrapy Mongodb重复键错误E11000 pymongo.errors.DuplicateKeyError:E11000

时间:2019-12-31 00:56:24

标签: python django mongodb scrapy

我是python,django,scrapy和mongodb的新手 我想做什么? 试图将数据从scrapy持久化到通过Django创建的mongodb集合。因此,scrapy可以从该集合中读取数据并显示在页面上。

到目前为止我做了什么?

  • Django中的模型
class Project(models.Model):
    title = models.CharField(max_length=100)
    desc = models.CharField(max_length=100)
    urls = models.CharField(max_length=100)
  • 在0001_initial.py之后生成项目迁移时,这意味着django自动生成了字段“ id”
# Generated by Django 2.2.8 on 2019-12-27 03:09

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Project',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('title', models.CharField(max_length=100)),
                ('desc', models.CharField(max_length=100)),
                ('urls', models.CharField(max_length=100)),
               # ('image', models.FilePathField(path='/img')),
            ],
        ),
    ]
  • 以下是我的蜘蛛pipeline.py文件
class ProjectspiderPipeline(object):
    def __init__(self):
        self.conn = pymongo.MongoClient('localhost', 27017)
        db = self.conn['djangodb']
        #self.collection = db['spiderCollection']
        self.collection = db['projects_project']

    def process_item(self, item, spider):
        self.collection.insert(dict(item))
        return item
  • 这是我的items.py
import scrapy

class ProjectspiderItem(scrapy.Item):

    _id = scrapy.Field()
    title = scrapy.Field()
    desc = scrapy.Field()
    url = scrapy.Field()

  • 现在,当我尝试在管道中使用self.collection = db['spiderCollection']运行我的Spider时。运行成功。
  • 但是,当我将集合更改为self.collection = db['projects_project']时。最终出现以下错误:
error raise DuplicateKeyError(error.get("errmsg"), 11000, error)
pymongo.errors.DuplicateKeyError: E11000 duplicate key error collection: djangodb.projects_project index: __primary_key__ dup key: { id: null }

如果有人可以指导我这两个选项中的任一个,我将不胜感激: -如何在Spider中为_id添加自动生成的值? -我们可以绕过django中自动生成的ID还是不像0001_initial.py文件中那样生成自动生成的ID来迁移?

感谢并欣赏堆堆。

1 个答案:

答案 0 :(得分:0)

我建议不要自己生成mongodb ObjectId,而让数据库为您自动生成它。 MongoDB生成的_id将是唯一的,您还可以在保存项目后检索它。只需将对象发送到不带_id字段的数据库中,mongodb就会为您生成它。