'bulk insert documents
:param doc_or_docs: a document or list of documents to be inserted
:param load_bulk (optional): If True returns the list of document
instances
:param write_concern: Extra keyword arguments are passed down to
:meth:`~pymongo.collection.Collection.insert`
which will be used as options for the resultant
``getLastError`` command.  For example,
``insert(..., {w: 2, fsync: True})`` will wait until at least
two servers have recorded the write and will force an fsync on
each server being written to.
:parm signal_kwargs: (optional) kwargs dictionary to be passed to
the signal calls.
By default returns document instances, set ``load_bulk`` to False to
return just ``ObjectIds``
.. versionadded:: 0.5
.. versionchanged:: 0.10.7
Add signal_kwargs argument'

def insert(self, doc_or_docs, load_bulk=True, write_concern=None, signal_kwargs=None):

    Document = _import_class('Document')
    if (write_concern is None):
        write_concern = {}
    docs = doc_or_docs
    return_one = False
    if (isinstance(docs, Document) or issubclass(docs.__class__, Document)):
        return_one = True
        docs = [docs]
    for doc in docs:
        if (not isinstance(doc, self._document)):
            msg = ("Some    documents    inserted    aren't    instances    of    %s" % str(self._document))
            raise OperationError(msg)
        if (doc.pk and (not doc._created)):
            msg = 'Some    documents    have    ObjectIds    use    doc.update()    instead'
            raise OperationError(msg)
    signal_kwargs = (signal_kwargs or {})
    signals.pre_bulk_insert.send(self._document, documents=docs, **signal_kwargs)
    raw = [doc.to_mongo() for doc in docs]
    try:
        ids = self._collection.insert(raw, **write_concern)
    except pymongo.errors.DuplicateKeyError as err:
        message = 'Could    not    save    document    (%s)'
        raise NotUniqueError((message % six.text_type(err)))
    except pymongo.errors.OperationFailure as err:
        message = 'Could    not    save    document    (%s)'
        if re.match('^E1100[01]    duplicate    key', six.text_type(err)):
            message = u'Tried    to    save    duplicate    unique    keys    (%s)'
            raise NotUniqueError((message % six.text_type(err)))
        raise OperationError((message % six.text_type(err)))
    if (not load_bulk):
        signals.post_bulk_insert.send(self._document, documents=docs, loaded=False, **signal_kwargs)
        return ((return_one and ids[0]) or ids)
    documents = self.in_bulk(ids)
    results = []
    for obj_id in ids:
        results.append(documents.get(obj_id))
    signals.post_bulk_insert.send(self._document, documents=results, loaded=True, **signal_kwargs)
    return ((return_one and results[0]) or results)
