code: func (p *Pipe) Iter() *Iter {
  	// Clone session and set it to Monotonic mode so that the server
  	// used for the query may be safely obtained afterwards, if
  	// necessary for iteration when a cursor is received.
  	cloned := p.session.Clone()
  	cloned.SetMode(Monotonic, false)
  	defer cloned.Close()
  	c := p.collection.With(cloned)
  
  	var result struct {
  		// 2.4, no cursors.
  		Result []bson.Raw
  
  		// 2.6+, with cursors.
  		Cursor struct {
  			FirstBatch []bson.Raw "firstBatch"
  			Id         int64
  		}
  	}
  
  	cmd := pipeCmd{
  		Aggregate: c.Name,
  		Pipeline:  p.pipeline,
  		AllowDisk: p.allowDisk,
  		Cursor:    &pipeCmdCursor{p.batchSize},
  	}
  	err := c.Database.Run(cmd, &result)
  	if e, ok := err.(*QueryError); ok && e.Message == `unrecognized field "cursor` {
  		cmd.Cursor = nil
  		cmd.AllowDisk = false
  		err = c.Database.Run(cmd, &result)
  	}
  	firstBatch := result.Result
  	if firstBatch == nil {
  		firstBatch = result.Cursor.FirstBatch
  	}
  	return c.NewIter(p.session, firstBatch, result.Cursor.Id, err)
  }
docs: // Iter executes the pipeline and returns an iterator capable of going
  // over all the generated results.